学习完大话设计模式,其中的六种原则是很重要的,我们知道设计模式是软件设计的思想,而不是软件技术。它重在使用接口与抽象类来解决各种问题,在使用这些设计模式时,我们应该遵守这六大原则。
单一职责原则:就一个类而言,应该仅有一个引起它变化的原因.即一个类只负责一项职责.
问题 | 类Class负责R1和R2两个不同的职责,当由于职责R1需求发生改变而需要修改Class时,有可能会导致原本运行正常的职责R2功能发生故障。 |
解决办法 | 遵循单一职责原则,分别建立两个类,Class1和Class2. Class1完成R1的功能,Class2完成R2的功能。这样不管修改哪一个类,都不会影响另一个类的职责发生故障。 |
不用单一职责原则时 | 由于职责扩散(因为某种原因,职责R1被分化为粒度更细的职责r1和r2)。遵循单一职责,需要将类Class分解为两个类Class1和Class2,原本的程序已经写好了,这样做太浪费时间,所以简单的修改类Class,用它负责两个职责更加好。 |
遵循单一职责的优点:1、可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定比负责多项职责简单的多。
2、提高类的可读性,提高系统的可维护性。
3、变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
开放封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。
特征:
| 1、对于扩展是开放的。2、对于更改是封闭的。 |
问题 | 在软件的生命周期内,因为某些原因,需要对原有代码进行修改,这过程中可能会给旧代码中引入错误,也可能会使我们不得对整个功能进行重构,并且需要原有代码经过重新测试。 |
解决办法 | 利用开闭原则,尽量通过软件实体的行为来实现变化,而不是通过修改代码来实现变化。 |
依赖倒转原则:1、高层模块不应依赖低层模块,两个都应该依赖抽象。
2、抽象不应依赖细节,细节应该依赖抽象。
问题 | 类ClassA直接依赖ClassB,假如将ClassA改为依赖ClassC,则必须通过修改ClassA代码来实现。 |
解决 | 将ClassA修改为依赖接口I,ClassB、ClassC各自实现接口I,ClassA通过接口I间接与ClassB、ClassC发生联系,降低了修改ClassA的几率。 |
里氏代换原则:子类必须能够替换掉他们的父类型。
解释 | 一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。 |
迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
根本思想 | 强调了类之间的松耦合 |
优点 | 类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及 |
合成聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
聚合表示一种弱的拥有关系,合成是一种强的拥有关系。合成的部分和整体的生命周期一样。
优点:有限使用对象的合成/聚合将有助于保持每个类呗封装,并集中在单个任务上。
总结:
设计模式原则再加上OOP三大属性,封装、继承、多态,我们就可以清楚的理解设计模式了。设计模式的核心原则是开闭原则,所有的原则都围绕着它进行展开。