七大设计原则:
实际开发中,并不是一定要求所有代码都强制遵循设计原则,需要考虑人力、时间、质量,要在适当的场景遵循设计原则,能够根据实际情况平衡取舍,帮助我们设计更家优雅的代码结构。
开闭原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特法则
里氏替换原则
合成复用原则
开闭原则:Open-Closed Principle, OCP
对扩展开放、对修改关闭
强调用抽象构建框架,用实现扩展细节
生活案例:弹性工作时间,规定每天工作8个小时,早来早走,晚来晚走
程序案例:
版本更新,尽可能不修改源码,但可以增加新功能
商超各种商品定价、优惠活动
design.principle.openclose
依赖倒置原则:Dependence-Inversion Principle, DIP
高层模块不依赖底层模块,二者都应该依赖其抽象
抽象不应该依赖细节,细节应该依赖抽象
依赖注入三种注入方式:
传参方式、构造器方式、Setter方式(一般用于全局单例)
切记:以抽象为基准比以细节为基准搭建起来的架构要稳定得多,因此在拿到需求之后,要面向接口编程,先顶层再细节来设计代码结构
design.principle.dependencyinversion
单一职责原则:Simple-Responsibility Principle, SRP
一个ClassinterfaceMethod 只负责一项职责
不要存在大于一个导致功能变更的原因,降低变更引起的风险
design.principle.simpleresponsibility
接口隔离原则:Interface-Segregation Principle, ISP
用多个专门的接口,而不使用单一的总接口,
【客户端不应该依赖它不需要的接口】
一个类对一类的依赖应该建立再最小的接口之上
建立单一的接口,不要建立庞大臃肿的接口
尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)
design.principle.interfacesegregation
迪米特法则:Law of Demeter, LOD
最少知道原则:Least Knowledge Principle, LKP
尽量降低类与类之间的耦合
强调只和朋友交流,不和陌生人说话
design.principle.demeter
里氏替换原则:Liskov-Substitution Principle, LSP
只存在父类与子类之间,用于约束继承泛滥
子类【可以扩展】父类功能,但【不能改变】父类原有的功能
子类可以实现父类的抽象方法,但不能覆盖父类的抽象方法
子类中可以增加自己特有的方法 当子类的方法实现父类的方法时(重写/重载或实现抽象方法):
方法的前置条件(即方法的入参)要比父类方法的入参更宽松?
方法的后置条件(即方法的返回值)要比父类更严格或相等?
design.principle.liskovsutiution
合成复用原则:Composite/Aggregate Reuse Principle, CARP
尽量使用对象组合(has-a)/ 聚合(contanis-a),而不是继承关系达到软件复用的目的
组合/聚合 称之为黑箱复用;继承 叫做白箱复用
design.principle.compositereuse
总结:
学习设计原则,千万不能形成强迫症。碰到业务复杂的场景,我们需要随机应变。