设计模式的7大原则(小结)

单一职责原则

1.概念:职责单一,一个类(对象)只有一个引起它变化的原因。

2.用处:如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会受到意想不到的破坏。因此单一职责原则能降低类的复杂度,提高可读性和可维护性。

3.个人经历:

    (1)以前我在做项目时,需要更新和插入一个对象的数据,因为大部分字段是相同的,我就把更新和插入写在了一个方法里,然后在方法里判断到底该更新还是插入,然后不管是更新还是插入,直接调用这个方法就好。现在想来,就违反了单一职责原则,当时只是考虑到避免重复性代码,但导致后面需求变更,然后更新和插入不好判断时,难以修改和维护。

    (2)还有,以前我会将功能全堆在一个类里或者一个方法里,想着能实现功能就行,但是这就导致了一个方法过长判断过多,同样也违反了单一职责原则。

开放封闭原则

1.概念:对扩展开放,对修改关闭。开放封闭原则的精神所在就是,增加新的代码而不是修改已有的代码。

2.功能:如果一个软件能满足开放封闭原则,那么该软件有很强的适应性和灵活性,那些已经存在的抽象模块,也不需要被修改,有很强的稳定性和持久性。

3.个人经历:在单一职责原则举的第一个例子可以看出,同样也不符合开放封闭原则。

依赖倒转原则

1.概念:高层模块不应该依赖底层模块,两个都应该依赖于抽象。抽象不依赖于细节,细节依赖于抽象。也就是说要面向对象编程,不要面向实现编程。

  (注:抽象就是指接口或抽象类,两者都是不能直接被实例化的,细节就是实现类)

2.功能:依赖倒置原则可以减少类间的耦合性,提高系统的稳定,降低并行开发引起的风险,提高代码的可读性和可维护性。

3.举例:看了一个依赖倒转的例子,如张三开奔驰,现在就是具体和具体的结合,当换人或者换车,都要改动不少代码,如果使用依赖倒转原则,都依赖于抽象,那么可以抽象为人开车,置于什么人和什么车,可以再通过具体实现,如果是新司机或新车,就直接增加代码就行,也符合开放封闭原则。

里氏代换原则

1.概念:子类必须能够替换掉他们的父类(因为只有当子类可以替换父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也能在父类基础上增加新的行为)。

2.功能:正是由于子类的可替换性,才使得使用父类类型的模块,在无需修改的情况下就可以扩展,即里氏代换原则,使得开放-封闭原则成为了可能。

3.举例:看了一个里氏代换原则的例子,如父类一个方法是实现1+2-3的计算,那么在子类继承时,当想要将方法改变为1-2+3的计算,如果遵守里氏代换原则,就应该新增一个方法,而不是将父类继承的方法覆盖重写。里氏替换原则是继承复用的基石,只有当衍生类可以替换基类,软件单位的功能不受到影响时,那么基类才能真正被复用。因为继承带来的侵入性,增加了耦合性,也降低了代码灵活性,父类修改代码,子类也会受到影响,此时就需要里氏替换原则。

迪米特法则(感觉还没怎么领悟)

1.概念:迪米特法则,也称最少知识原则,即一个对象应该对其他对象保持最少的了解。对外除了提供public方法外,不对外泄露任何消息。

2.功能:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。迪米特法则意义就在于降低类之间的耦合,由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

3.举例:看了一个关于迪米特法则的例子,如有A,B,C三个类,B类调用A类里对外提供的方法,方法是public void bMethod(C c),这样B类和A类都依赖于C类,不符合高内聚低耦合,而应该改成B调用A,A调用C,方法改为public void bMethod(),这样就符合迪米特法则了,即每个模块只和自己的朋友“说话”,不和陌生人“说话”。

隔离接口原则

1.概念:客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上。

2.功能:避免接口污染;提高灵活性;提供定制服务;实现高内聚。

3.实现:接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。提高内聚,减少对外交互,使接口用最少的方法去完成最多的事情。

4.举例:在能够再分的情况下,左图通过隔离接口原则,形成了右图:

                               图1                                                                  图2

合成复用原则

1.概念:通过在一个新的对象中引入(注入)已有的对象以达到类的功能复用和扩展的目的。它的设计原则是要尽量使用合成或聚合而不要使用继承来扩展类的功能。

2.必要性:为什么不用继承而要用合成符合原则,是因为继承复用会将父类的实现细节直接暴露给了子类,这违背了信息隐藏的原则。然后父类如果发生改变,那么子类也要发生相应的改变,耦合度过高,不利于类的扩展、维护等,也是系统变得脆弱。而用合成和聚合的时候新对象和已有对象的交互往往是通过接口或者抽象类进行的,就可以很好的避免上面的不足,而且这也可以让每一个新的类专注于实现自己的任务,符合单一职责原则。

3.举例:

 

                        图1:继承                                                   图2:合成复用                                   

原文地址:https://www.cnblogs.com/wencheng9012/p/13476926.html