写在学习设计模式之前。

设计模式的学习还是源自看Tomcat源码太吃力了,上来给我一个门面模式,一个装饰者模式。索性不如先学习设计模式,然后倒过头来翻源码。

设计模式

开放-封闭原则

  • 对于扩展是开放的

  • 对于更改是封闭的

面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有代码。

接口隔离原则

  • 客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

依赖倒转原则

  • 高层模块不依赖底层模块。两者都应该以来抽象
  • 抽象不应该依赖细节。细节应该依赖抽象。

里氏代换原则

  • 一个软件实体如果使用的是一个父类,那么一定适用于其子类。而且察觉不出父类对象呢和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化

迪米特法则 最少知识原则

  • 如果两个类不必彼此直接互相通信,那么两个类就不应当发生直接的相互作用。如果一个类需要调用另外一个类的某一个方法,可以通过第三者转发这个调用。

合成复用原则

  • 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

通常类的复用分为继承复用和合成复用两种。

继承复用虽然有简单和易实现的优点,但它也存在以下缺点:

  1. 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
  2. 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
  3. 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。

采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点:

  1. 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  2. 对象间的耦合度低。可以在类的成员位置声明抽象。
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。