文章目录
1. 软件设计原则
分享设计模式,首先要分享下软件的设计原则,设计原则是理论基础,设计模式是实现方法。
软件设计原则总共有七条,分别是:
- 开闭原则。
- 依赖倒转原则。
- 单一职责原则。
- 接口隔离原则。
- 迪米特原则(不和陌生人说话)。
- 里式替换原则。
- 合成聚合复用原则。
2. 设计原则解析
2.1 开闭原则
开闭原则指的是对扩展开放,对修改关闭。也就是说它能够在不修改原有内容的基础上,扩展原有的功能。
听上去非常玄幻,不修改还能扩展功能,怎么做呢,实现开闭原则的关键步骤就是抽象化。
举个例子:模板方法模式,每增加一个抽象模板的实现类,都可以对原有软件功能进行扩展。
2.2 依赖倒转原则
依赖倒转原则,指的是不应该依赖具体,而应该依赖抽象,这样可以降低耦合性。
举个迭代List的例子吧,我们写个迭代List的方法,一般这样写:
private void iterator(List<String> list) {
list.stream().forEach(item->{
System.out.println(item);
});
}
方法入参上,我们一般都用List,不用LinkedList,不用ArrayList,这就是依赖倒置的体现。
2.3 单一职责原则
单一职责原则指的是我们的类或者方法,只负责一项职责就好了,不要负责的太多。
负责太多有什么问题呢?耦合性比较高,逻辑复杂,可读性,可维护性,复用性都比较低。
做软件就像搭积木,积木块圆的就是圆的,方的就是方的,又圆又方的显得不伦不类,不方便使用。
2.4 接口隔离原则
接口隔离原则,指的是接口要专用,便于把功能隔离开,不要使用一个庞大臃肿的接口。
拿交通工具举个例子,汽车是在陆地上跑的,轮船是在水里跑的,飞机是在天上飞的。我们要用三个接口
分别表示在陆地上行进的,在水里行进的,在天空中飞的,不要用一个接口来表达。
一个接口表达
public interface Traffic {
void vehicle();
void shipping();
void fly();
}
分开表达
public interface Vehicle {
void vehicle();
}
public interface Shipping {
void shipping();
}
public interface Fly {
void fly();
}
水路两栖坦克
public class Tank implements Vehicle, Shipping{
@Override
public void shipping() {
}
@Override
public void vehicle() {
}
}
2.5 迪米特法则(不和陌生人说话)
迪米特法则是指一个软件实体应当尽可能少的与其他实体发生相互作用。迪米特法则可以降低系统的耦合度。
举个例子,门面模式就是迪米特法则的应用。
2.6 里氏代换原则
里氏代换原则是说,任何基类可以出现的地方,子类一定可以出现。
里氏代换原则是继承复用的基石,只有当子类可以替换掉基类,软件功能不受到影响时,基类才能真正被复用,而子类也能够在基类的基础上增加新的行为。
2.7 合成聚合复用原则
合成聚合复用原则指的是尽量使用合成和聚合,少用继承。为什么少用继承呢,因为继承不灵活。合成聚合复用使用已有对象的组合来生成新的对象,通过向这些已有对象委派达到复用已有功能的目的。spring的bean注入就是合成聚合的体现。
聚合:聚合表示整体与部分的关系,是一种松散的拥有关系,部分可以脱离整体存在。
合成:合成是一种强的拥有关系,部分不能脱离整体存在。
3. 总结
本文介绍了软件设计的7个原则。