1. 设计模式6大原则
1.1.类单一职责
一个类只负责一项职责,不要存在多余一个职责导致类的变更。
比如:类A负责两个不同的职责,b,c职责。由于b职责需求发生变化而需要改变A类,原本运行正常的c职责出现故障。
what:
这个由字面意思就很好理解了,顾名思义,功能要单一。
准确的解释是:就一个类而言,应该仅有一个引起它变化的原因。
why:
我们在做编程的时候,很自然给一个类加各种各样的功能,这就意味着,无论任何需求要来,都需要改这个窗体类,这样维护麻烦,不能复用,缺乏灵活性。
1.2.里氏替换原则
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
总之尽量不要重写父类已经实现的方法,可以用接口其它方法绕过去。
what:
白话:一个软件实体如果使用的是一个父类的话,那么一定适用于其他子类,而且它觉察不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。
简单来说:子类型必须能够替换掉它们的父类型。
这就好像是继承时理解的概念
why:
只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
1.3.依赖倒置原则
高层模块不应该依赖底层模块,都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。
总之:多用抽象的接口来描述要做的动作,降低实现这个动作的事务之间的耦合度。(各自拥有各自的接口,不要放在一起使用,降低耦合性)
what:
- 高层模块不应该依赖于底层模块,两个都应该依赖抽象。
- 抽象不应该依赖细节,细节应该依赖于抽象。
说白了,就是针对接口编程,不要对实现编程。
why:
如果我们将高层模块依赖了低层模块,那么想再次利用高层模块时,就没有办法复用了,因为高层模块是与低层模块的访问数据库绑在一起的。如果都依赖与抽象,也就是接口或抽象类,那么只要接口是稳定的,更改任何一个模块都不会造成影响,
1.4.接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖建立在最小的接口上。
总之就是一个接口尽量完功能的单一,不要让一个接口承担过多的责任。
what:
一个类对另外一个类的依赖应该建立在最小接口上。即建立单一接口,只建立需要的,剔除多余的。
why:
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。
1.5.迪米特法则
经查最早是在1987年由美国Northeastern University的Ian Holland提出。一个类尽量封装自己,除了对外提供public方法之外,其它的不对外泄露信息。至于自己的成员变量和参数打交道,不与其它打交道。
what:
迪米特法则根据字面难以推敲出什么意思,1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一Booch等普及。后来,因为在经典著作《 The Pragmatic Programmer》而广为人知。
它又叫做最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
它首先强调的前提是:在类的结构设计上,每一个类都应该尽量降低成员的访问权限。也就是说,一个类包装好自己的private状态,不需要让别的类知道字段或行为就不要public。
迪米特法则的核心思想是强调了类之间的松耦合。
why:
类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
信息的隐藏促进了软件的复用。
1.6,开闭原则
对扩展开放,修改关闭。
尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
what:
开放-封闭原则,对什么开放?对什么封闭呢?
这个原则其实是有两个特征,一个是说“对于扩展是开放的(open for extention)“,另一个是说”对于更改是封闭的(colsed for modification)”。
why:
设计软件要容易维护又不容易出问题的最好的办法,就是多扩展,少修改。
我们在做任何系统的时候,都不要指望一开始需求确定了,就永不再变,这是不科学也是不现实的想法。既然需求一定会变化,那么在设计软件时可以相对容易修改。不至于说,新需求一来,就推到整个程序。那么怎样设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?这就是开放-封闭原则带给我们的答案。