我是靠谱客的博主 壮观硬币,最近开发中收集的这篇文章主要介绍软件设计原则(一) 单一职责原则一、简介二、概念三、原理四、示例五、优化六、总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、简介

二、概念

三、原理

四、示例

五、优化

六、总结


一、简介

在学习设计模式之前,首先需要了解软件设计的七大原则:

  • 单一职责原则
  • 接口隔离原则
  • 依赖倒置原则
  • 里氏替换原则
  • 开闭原则
  • 迪米特原则
  • 合成复用原则

二、概念

对类而言,一个类/接口/方法应该只负责一项职责。

A负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。也就是说职责P1和P2被耦合在了一起。所以需要将类A分解为A1、A2,使A1、A2分别负责职责1、职责2,两者互不影响。

解决方法:遵守单一职责原则,将不同的职责封装到不同的类或模块中,分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。

三、原理

如果一个类承担的职责过多,就等于把这些职责耦合在一起,这个类耦合度就比较高,这样某一天其中一个职责的变化可能会影响甚至导致其他职责不可用。如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性。

四、示例

下面举一个违反单一职责原则的例子:

public class SingleResponsibility {
	public static void main(String[] args) {
		 Animal animal = new Animal();
		 animal.animal("狗");
		 animal.animal("老虎");
		 animal.animal("牛");
		 animal.animal("羊");
	}
}

class Animal{
	public void animal(String animal) {
		System.out.println(animal + "是肉食动物...");
	}
}

运行结果: 

很明显,牛、羊并不是肉食动物,而是植食动物,所以上述的代码有点问题。下面我们修改时如果遵循单一职责原则,需要将Animal类细分为肉食动物和植食动物,代码如下:

public class SingleResponsibility {
	public static void main(String[] args) {
		CarnivorousAnimal carnivorousAnimal = new CarnivorousAnimal();
		carnivorousAnimal.animal("狗");
		carnivorousAnimal.animal("老虎");
		 
		HerbivoresAnimal herbivoresAnimal = new HerbivoresAnimal();
		herbivoresAnimal.animal("牛");
		herbivoresAnimal.animal("羊");
	}
}

/**
 * 肉食动物
 */
class CarnivorousAnimal{
	public void animal(String animal) {
		System.out.println(animal + "是肉食动物...");
	}
}

/**
 * 植食动物
 */
class HerbivoresAnimal{
	public void animal(String animal) {
		System.out.println(animal + "是植食动物...");
	}
}

运行结果: 

我们会发现如果这样修改花销是很大的,除了将原来的类分解之外,还需要修改客户端的代码。

五、优化

但是,如上面的修改方式其实修改量有点大,而且扩展性不好,假如哪一天又有新需求,需要将肉食动物再进一步分类等等, 又需要将CarnivorousAnimal类进行分解,这样不太好。

public class SingleResponsibility2 {
	public static void main(String[] args) {
		 Animal animal = new Animal();
		 animal.carnivorousAnimal("狗");
		 animal.carnivorousAnimal("老虎");
		 animal.herbivoresAnimal("牛");
		 animal.herbivoresAnimal("羊");
	}
}

/**
 * 由于逻辑足够简单,这里在代码上违反单一职责原则,但是在方法级别上是满足单一职责,每个方法只负责一项职责,
 * 而且还不需要大量修改客户端代码 
 * 
 * 当然,肯定会有同学说这里可以使用接口,然后使用多态实现,本文主要展示单一职责原则, 只是为了说明单一职责的问题,所以此处没有使用接口或者抽象类方式。
 */
class Animal{
	public void carnivorousAnimal(String animal) {
		System.out.println(animal + "是肉食动物...");
	}
	
	public void herbivoresAnimal(String animal) {
		System.out.println(animal + "是植食动物...");
	}
}

运行结果:

可以看到,这种修改方式没有改动原来的方法,而是在类中新加了一个方法,这样虽然在代码级别违背了单一职责原则,但在方法级别上却是符合单一职责原则的,因为它并没有修改原来方法的代码。

六、总结

本文只是简单的说明单一职责原则的示例,我们需要在实际项目中好好领会这种思想并且运用到项目中去,这样我们才能真正有效地遵循单一职责原则来达到‘高内聚、低耦合’的目标。以下总结单一职责原则的优缺点:

优点:

  • a. 单一职责原则降低类的复杂度,一个类只负责一项职责;
  • b. 提高类的可读性,可维护性;
  • c. 降低变更引起的风险;
  • d. 通常情况下,应当遵循单一职责原则,只有在类的逻辑足够简单的情况下,可以在代码级别上违反单一职责原则:只有类中的方法足够少,可以在方法级别上保持单一职责原则;

缺点:

  • 如果一味追求这个单一职责,因为要分解类,可能会造成大量多余的类,这样也不好,不过接口和方法应该遵循这个原则;

最后

以上就是壮观硬币为你收集整理的软件设计原则(一) 单一职责原则一、简介二、概念三、原理四、示例五、优化六、总结的全部内容,希望文章能够帮你解决软件设计原则(一) 单一职责原则一、简介二、概念三、原理四、示例五、优化六、总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部