「撸一手好代码」设计模式之设计原则总结
总结
概述
- 开闭原则
功能添加通过扩展实现,而不是在原来的类上进行修改。
如:收银支付中不同支付方式的实现。规避if(...)...else if(...)...else...
这种不断堆砌来实现。
- 单一职责原则
每个类的功能单一。
如:用户操作类,就只有用户的增删改查等,用户权限作为另外一个类实现。
- 接口隔离原则
在依赖接口时,只依赖需要的最小功能的接口。
该原则的实现的前提是单一职责。需要被依赖的接口遵循了单一职责原则,那么接口隔离也就可以实现的比较好,不然始终依赖的是一个大的功能接口。
- 依赖倒置原则
依赖时,依赖接口而不依赖实现。
以上面收银支付为例,依赖一个支付接口而不是依赖各种具体的支付方式。
- 合成复用原则
功能复用,通过组合来实现而不是继承。
譬如飞天狗狗,狗狗的特殊能力通过给狗狗添加一个特殊能力(属性)来实现而不是继承。
- 迪米特法则
依赖其他的功能接口/类时,只需要知道直接依赖对象的信息。
- 里氏替换原则
继承时,子类不能改变父类的功能。
小结
开闭原则可以认为是总则,依赖倒置原则是实现开闭的一个手段。在依赖倒置的实现上,需要单一职责和接口隔离来保证接口和实现的处理质量。在实现中,通过合成复用和迪米特法则来降低耦合度,提高灵活性。在实现过程中,如果使用了继承,那么必须遵循里氏替换原则来保证系统的健壮性。
实例
收银时,采用依赖倒置,依赖收费接口,而不是收费实现。
收银时进行账单处理,只依赖进行账单处理的服务,不依赖包括账单统计等一系列账单服务管理的服务,这便是接口隔离原则。
支付接口实现时,不同的支付方式进行扩展实现,而不是修改已有的代码,便是遵循了开闭原则。
收费实现依赖支付接口时,不用去管支付时使用的什么方式的接口,这便遵循了迪米特法则。
微信支付中,只有支付功能,没有账单查询等附加功能,便是单一职责。
在具体支付实现时,通过合成复用添加HttpClient请求客户端来实现功能复用,而不是微信/支付宝支付通过继承RestClient/SoapClient来实现。
在请求客户端实现时,RestClient/SoapClient使用了继承,这边需要遵循里氏替换原则。