单一职责,里氏替换,依赖倒置,接口隔离,迪米特法则,开闭原则
设计模式的六大原则
参考:
1. 单一职责原则
一个类只负责一个明确的功能
优点:
- 降低类的复杂度,提高代码可读性和可维护性
- 降低变更时对其他功能的影响
2. 里氏替换原则
原则一:若 o1 是 C1 的一个实例化对象, o2 是 C2 的一个实例化对象,如果在使用 C1 的程序中将o1 替换为 o2 而程序行为没有发生变化,那么 C2 应该是 C1 的子类。
原则二:所有用到基类对象的地方,如果把基类对象替换成子类对象,程序行为不应该发生变化。
实现方法:
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
- 允许子类拓展父类的方法
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
3. 依赖倒置原则
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
比如手机(Phone)依赖CPU,那么 Phone 就是一个高层模块, CPU 就是一的低层模块,Phone 显然不应该依赖一个具体的低层模块(如 Qualcomm865):
public class Phone {
private Qualcomm cpu;
Phone(){
this.cpu = new Qualcomm();
}
public void printConfig(){
System.out.println("cpu is" + this.cpu);
}
}
不管是高通还是麒麟,都应该抽象为一个CPU类,然后各自实现,高层模块只依赖于抽象的低层模块。
实现方法:
- 低层模块尽量都要有抽象类或接口,或者两者都有。
- 变量的声明类型尽量是抽象类或接口。
- 使用继承时遵循里氏替换原则。
4. 接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 使用多个隔离的接口,比使用单个接口要好.
5. 迪米特法则
一个对象应该对其他对象保持最少的了解。
高内聚,低耦合
6. 开闭原则
对拓展开放,对修改封闭:当系统变化时,尽量通过拓展来实现变化,而不是去修改原有代码;