1.开闭原则
⼀个软件实体,如类,模块和函数应该对扩展开放,对修改关闭。所谓的开闭,是对扩展和修改两个⾏为的⼀
个原则。需要强调的是利⽤抽象构建框架,⽤实现扩展细节。
开闭原则是⾯向对象 基础的设计原则,它指导我们如何建立灵活稳定的系统。
2.依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,⾼层模块不应该依赖底层模块,⼆者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。通过依赖倒置,可以减少类与类之间的耦合性,提⾼系统的稳定性,提⾼代码的 可读性和可维护性,并能够降低修改程序所造成的⻛险。
3.单⼀职责原则
假设我们有⼀个Class负责两个职责,⼀旦发⽣需求变更,修改其中⼀个职责的逻辑代码,有可能会导致另⼀个职责的功能发⽣故障。这样⼀来,这个Class存在两个导致类变更的原因。
在设计的时候将类尽可能拆分,保证⼀个类只负责实现⼀个功能,降低代码的复杂度,在需求变更时,减⼩维护更改的影响范围,,提⾼代码维护性。
4.接⼝隔离原则
接⼝隔离原则(Interface Segregation Principle, ISP)是指⽤多个专⻔的接⼝,⽽不使⽤单⼀的总接⼝,客户端不应该依赖它不需要的接⼝。
接⼝隔离原则符合我们常说的⾼内聚低耦合的设计思想,从⽽使得类具有很好的可读性,可扩展性和可维护性。我们在设计接⼝的时候,要多花时间去思考,要考虑业务模型,包括以后有可能发⽣变更的地⽅还要做⼀些预判。所以,对于抽象,对业务模型的理解 是非常重要的。
5.迪米特法则
迪米特原则(Law of Demeter LoD)是指⼀个对象应该对其他对象保持 少的了解,⼜叫 少知道原则(LeastKnowledge Principle,LKP),尽量降低类与类之间的耦合。 比如物流Service需要查询订单的状态,不⽤在物流Service中增加接⼝,⽽是在订单Service中增加⼀个查询订单状态的接⼝。
6.⾥⽒替换原则
⼀个软件实体如果适⽤⼀个⽗类的话,那⼀定是适⽤于其⼦类,所有引⽤⽗类的地⽅必须能透明地使⽤其⼦类的对 象,⼦类对象能够替换⽗类对象,⽽程序逻辑不变。根据这个理解,我们总结⼀下:引申含义:⼦类可以扩展⽗类的功能,但不能改变⽗类原有的功能。
⾥⽒替换原则是对⼦⽗类关系的描述,即⼦类可以完全替代⽗类,但是⽗类不能替代⼦类。
7.合成复⽤原则
合成复⽤原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使⽤对象组 合(has-a)/聚合(contanis-a),⽽不是继承关系达到软件复⽤的⽬的。可以使系统更加灵 活,降低类与类之间的耦合度,⼀个类的变化对其他类造成的影响相对较少。继承我们叫做⽩箱复⽤,相当于把所有的实现细节暴露给⼦类。组合/聚合也称之为⿊箱复⽤,对类以外的对象是⽆法获取到实现细节的。
总结
设计原则包括: 开闭原则/单⼀原则/依赖倒置原则/接⼝隔离原则/迪米特原则/⾥⽒替换原则/合成复⽤原则
1.对修改关闭,对扩展开放;
2.单⼀职责,⼀个接⼝/类只做⼀件事,降低类和接⼝复杂度,提⾼代码维护性;
3.采⽤接⼝和抽象类来应对变化,通过抽象来定义框架,使⽤实现来扩展细节,应对需求变化;
4.⼦类可以替换⽗类,⽗类不能替换⼦类;
5.组合优于继承,降低类与类之间的耦合;
6.接⼝定义应该尽量细化,尽量避免⼀个接⼝实现多个功能的情况