状态模式 State Pattern
2020-03-21
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 《Head First 设计模式》举的例子是糖果机:糖果机定义了投币、退币、转动曲柄、发放糖果等行为,也有未投币、已投币、售出、已售罄等状态,可以使用 int 常量或枚举来标识这些状态。在客户端对糖果机发出请求时,糖果机内部每种行为都要使用大量的 if 语句进行状态判断和切换,不仅混乱,而且不利于扩展,例如新增一个状态就要大量修改原有代码。 …
中介者模式 Mediator Pattern
2020-03-19
在没有中介者的情况下,所有的对象都要认识其他对象,有了中介者后,对象只需要与中介者通信,对象之间彻底解耦。但是如果设计不当,中介者本身会过于复杂。 …
观察者模式 Observer Pattern
2020-03-15
对象之间常有依赖关系,观察者模式可以让我们方便地监听一个对象,当它发生改变时,其他对象会自动收到通知并作出相应的反应。 …
命令模式 Command Pattern
2020-03-13
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。 对这个设计模式的解读,网上一些文章存在误区。 …
代理模式 Proxy Pattern
2020-03-10
客户端不能或不想直接使用一个类时,用代理模式可以实现间接使用。 代理模式一般指的是静态代理,即在编译时实现,代理类 SubjectProxy 与被代理的真实类 RealSubject 实现同一个 Subject 接口,SubjectProxy 维护一个 RealSubject 实例,客户端通过 SubjectProxy 来间接使用 RealSubject。 Java 可以实现动态代理,在运行时定制或增强功能。 …
享元模式 Flyweight Pattern
2020-03-08
享元模式与其说是一种设计模式,不如说是一种算法思想。将可以共享的对象存储在一个表中以节省内存,而不是每次都重新创建。 例如,Java 中的 Integer 类型对 -128 到 127 的值做了缓存,java.lang.Integer#valueOf(int) 会直接返回缓存的对象。String 则可以保存在常量池中。这些都是典型应用。 使用享元模式的一个条件是,对象是可共享的,例如对于 Integer、String,只要值相同,即使指向相同的对象一般也没有问题。 但可共享不一定是不可变的,需要共享的只是对象的内部状态,外部状态可以是变化的。例如,设计一种“字符”类型,它的内容是内部状态,坐标是外部状态,相同内容的字符可以设置不同的坐标来共享使用。 …
外观模式 Facade Pattern
2020-03-07
将一个系统划分为若干子系统,有利于降低系统的复杂性,但是会使客户端的调用复杂化。 外观模式将这些子系统封装到一个类中,对客户端屏蔽这些子系统,提供一个高层、简单的接口。这也是我们不自觉就使用过的设计模式,只不过以前可能不知道名字而已。 …
桥接模式 Bridge Pattern
2020-03-06
当一个抽象可以有多个实现时,通常用继承来协调它们。 例如,对于表示形状的抽象类,可以有圆形、矩形等具体实现,但使用的绘图 API 实现可以不同,如果为每种形状类再定义各种 API 的版本,不仅复杂,而且抽象与实现绑定在一起,不能在运行时改变。 桥接模式可以将抽象和实现分别放在独立的类层次结构中,两者可以独立地进行扩充。其实桥接模式没那么玄乎,我们在很多时候都不经意地使用了。 …