学习设计模式前,应该对这六大原则有很清晰认识,然后学设计模式就能很好的去理解和把控。所有的模式都是在这些原则的基础之上发展起来的,有的是侧重一个,有的是多个都有所涉及。看完设计模式之后,我感觉到每个模式都有这些原则的影子,并且每个模式都渗透着面向对象的三大特性,也觉得这些原则也都有相通之处。
原则 | 含义 | 具体方法 |
单一职责 | 就一个类而言,应该仅有一个引起它变化的原因。 | 高内聚低耦合的体现,不要乱拉关系 |
开放—封闭 | 对扩展开放,对修改关闭 | 多使用抽象类和接口 |
依赖倒转 | 要依赖于抽象,不要依赖于具体 | 针对接口编程,不要针对实现编程 |
里氏代换 | 子类必须能够替换它们的父类型 | 使用抽象类继承,不实用具体累继承 |
迪米特 | 一个软件实体尽可能少地与其他实体发生相互作用 | 通过中间类建立联系 |
合成/聚合原则 | 尽量使用合成/聚合,尽量不使用类继承。 | 尽量使用合成/聚合,尽量不使用类继承。 |
1、单一职责原则(SingleResponsibility Principle,简称SRP)
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者一直这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。而软件设计真正要做的许多内容,就是发现职责,并把这些职责相互分离。
2、 开放--封闭原则(TheOpen-Closed Principle,简称OCP)
是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。即对于扩展是开放的,对于更改是封闭的。 我们不可能做到很好的预测,在设计的时候尽可能让一个类足够好,设计好了就不要去修改了;不能完全封闭的情况下,当发生变化时,我们就创建抽象来隔离以后发生的同类变化。
3、依赖倒转原则(DependenceInversion Principle )
指高层模块不应该依赖低层模块,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。说白了就是要针对接口编程,不要对实现编程。举个例子:计算机硬件中,如果内存坏了,那么只需要换一个内存条就可以了,而不需要去换一个主板,在这里内存是一个接口类,只要符合他的规格要求就行,无论是那一根。
4、里氏代换原则(LiskovSubstitution Principle,简称LSP)
子类型必须能够替换掉他们的父类型。在软件里面,把父类都替换成其子类,程序的行为不会发生变化。正是由于子类型的可替换性才使得使用父类型的模块在无需修改的情况下就可以扩展。
5、迪米特法则(Law ofDemeter)
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法时,可以通过第三者转发这个调用。类之间的耦合越弱,就越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。主要是强调了类之间的松耦合。例子:无数人难办事
6、合成/聚合复用原则(Composition/AggregationPrinciple],简称CARP)
尽量使用合成/聚合,尽量不使用类继承。合成聚合是“has a”的关系,而继承是“is a”的关系。由于继承是一中强耦合的结构,父类变,子类必变。所以不是“is a”关系,我们一般不要用继承。优先使用合成聚合复用原则,有助于保持每个类的封装,降低继承的层次。
下面的总结中,我会把相关模式和原则结合起来总结!