设计模式之设计原则
开闭原则
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是扩展一个新的功能。
比如手机的导航为高德地图,现在需要修改为百度地图,不是修改高德地图的功能,而是要新增一个百度地图。
里氏替换原则
任何基类可以出现的地方,子类一定可以出现。通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。
比如显卡是矿机显卡的父类,如果某功能的参数是显卡,传入显卡返回一个图像,但是传入矿机显卡不能返回图像。(例子可能不太恰当),这个地方就违背了里氏替换原则。
依赖倒转原则
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
即:要求对抽象进行编程,而非对实现进行编程。
比如面食加工机根据不同的模型器可以加工出春卷,面条,饺子皮。在Machine set model的时候,把具体的机器传进去,而不是直接在Machine中做修改,导致业务耦合,违背了开闭原则。
接口隔离原则(单一接口原则)
客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。
比如某品牌汽车的中控系统有空调,灯光,环视三种功能,但是低配版的没有环视这个功能,所以中控系统不应该集成所有的功能。实现的时候应该细分中控系统
迪米特法则
最少知识原则,只和你的直接朋友交谈,不跟陌生人说话。
比如客户只会去找中介公司租房转租等,而不是和房东直接进行交流。
合成复用原则
尽量优先使用组合或者聚合等关联关系来实现,其次考虑继承实现。
继承复用缺点:
- 破坏了类的封装性。将父类的实现细节暴露给子类。
- 子类与父类的耦合度高。父类实现的任何改变都会导致子类实现发生变化,不利于类的扩展和维护。
- 限制了复用的灵活性,父类继承而来的实现是静态的,在编译时已经定义,运行时不能发生变化。
聚合复用优点:
- 维持了类的封装性,因为成分对象的内部细节是新对象看不见的。
- 对象间解耦,可以在类的成员位置声明抽象。
- 复用灵活性高。
比如某品牌手机,有黑白两款颜色,三种操作系统:ios,andriod,harmony。那么就会有2 * 3 = 6种不同的组合形式,即6种具体实现子类,随着颜色或系统种类的增多,具体实现的子类模型会越来越多。
正确的方式应该将某一属性抽象出来,作为一个属性复合到另一个类中。具体实现子类只需要set属性进去即可,比如某一款没有白色的比集成复用实现要简便合理。