资料学习整理自:B站尚硅谷
设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式设计的依据)
对类来说,即一个类应该只负责一项职责。
比如:一个类里面有两个具体业务的不同方法,方法一修改时,可能会影响到方法二,所以此时应该拆分为两个类。
目的与优点:
1)降低类的复杂度,一个类只负责一项职责;
2)提高类的可读性和可维护性;
3)降低变更引起的风险。
通常情况下,我们应担遵守单一职责原则;
什么情况可以不遵守单一职责原则:
1)业务逻辑足够简单,代码量足够少;
2)类中的方法数量足够少,可以在方法级遵守单一职责原则。
Interface Segregation Principle
一个类对另一个类的依赖,应该建立在最小的接口上。
比如:类A需要使用类B实现的接口1上的部分方法,类C需要使用类D实现的接口1上的部分方法,此时应该将接口1拆分成颗粒度更小的接口单元。
未遵循接口隔离原则:
应该调整为:
Dependence Inversion Principle
1)高层模块不应该依赖底层模块,二者都应该依赖其抽象
2)抽象不应该依赖细节,细节应该依赖抽象
3)依赖倒置(倒转)的中心思想是面向接口编程
4)依赖倒置原则的设计理念:
5)使用接口或抽象类的目的是制定规范(设计),而不涉及任何具体的操作,把展现细节的任务交给实现类完成。
1)通过接口的传递实现依赖
//开关
interface IOpenAndClose{
public void open(ITV tv);//抽象方法接收抽象类
}
//电视
interface ITV{
//ITV接口,可以涵盖各种电视
public void play();
}
//具体实现
class OpenAndClose implements IOpenAndClose{
public void open(ITV tv){
tv.play;
}
}
// main >>> 给实现类传入具体的电视
2)通过构造方法实现依赖
//开关
interface IOpenAndClose{
public void open(ITV tv);//抽象方法接收抽象类
}
//电视
interface ITV{
//ITV接口,可以涵盖各种电视
public void play();
}
//具体实现
class OpenAndClose implements IOpenAndClose{
ITV tv;
public OpenAndClose(ITV tv){
this.tv = tv;
}
public void open(){
this.tv.play;
}
}
// main >>> 给实现类传入具体的电视
3)通过setter方法实现传递
//开关
interface IOpenAndClose{
public void open(ITV tv);//抽象方法接收抽象类
public void setTV(ITV tv);//set属性
}
//电视
interface ITV{
//ITV接口,可以涵盖各种电视
public void play();
}
//具体实现
class OpenAndClose implements IOpenAndClose{
ITV tv;
public void setTV(ITV tv){
this.tv = tv;
}
public void open(){
this.tv.play;
}
}
// main >>> 给实现类传入具体的电视
Liskov Substitution Principle
1)所有引用基类的地方必须能透明地使用其子类的对象;
2)在使用继承时,在子类中尽量不要重写父类的方法;
3)继承实际上增强了两个类之间的耦合性,适当情况下,可以通过聚合、组合、依赖或共同继承一个更高级的类来解决问题。
总结:描述的就是子类继承父类时,不要轻易去修改父类的方法,这样会导致父类的方法变得不透明。当父类的方法修改时,子类重写的方法将得不到改变。
Open Closed Principle
1)一个软件实体如类、模块和函数应该是对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
2)当软件需要变化时,尽量通过 ,而不是通过修改已有的代码来实现变化。
3)编程中遵循其他原则,以及使用设计模式的目的就是为了遵循开闭原则。
Demeter Principle 最少知道原则
1)一个类对自己依赖的类知道的越少越好。
2)只与最直接的朋友通信:
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多:依赖、关联、组合、聚合等。
1)迪米特法则的核心是降低类之间的耦合;
2)由于每个类都减少了不必要的依赖,因此迪米特法则指示要求降低类之间(对象之间)耦合关系,并不是要求完全没有依赖关系。
总结:只与最直接的朋友通信!如果目标不是最直接的朋友,那就尝试把它变成最直接的朋友!
Composite Reuse Principle
尽量使用合成/聚合的方式,而不是使用继承
合成:
1)B类以参数的形式传入A类;
2)B类创建A类的实例
聚合:
通过setter方法,把A类传入B类
1)找出应用中需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
2)针对接口编程,而不是针对针对实现编程;
3)为了交互对象之间的松耦合设计而努力。