状态模式 State Pattern
2020-03-21
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 《Head First 设计模式》举的例子是糖果机:糖果机定义了投币、退币、转动曲柄、发放糖果等行为,也有未投币、已投币、售出、已售罄等状态,可以使用 int 常量或枚举来标识这些状态。在客户端对糖果机发出请求时,糖果机内部每种行为都要使用大量的 if 语句进行状态判断和切换,不仅混乱,而且不利于扩展,例如新增一个状态就要大量修改原有代码。 …
中介者模式 Mediator Pattern
2020-03-19
在没有中介者的情况下,所有的对象都要认识其他对象,有了中介者后,对象只需要与中介者通信,对象之间彻底解耦。但是如果设计不当,中介者本身会过于复杂。 …
观察者模式 Observer Pattern
2020-03-15
对象之间常有依赖关系,观察者模式可以让我们方便地监听一个对象,当它发生改变时,其他对象会自动收到通知并作出相应的反应。 实例 public class Subject { private int mState; private List<Observer> mObservers = new ArrayList<>(); public void setState(int state) { mState = state; notifyObservers(); } @Override public String toString() { return "State: " + mState; } public boolean addObserver(Observer o) { return mObservers.add(o); } public boolean removeObserver(Observer o) { return mObservers.remove(o); } private void notifyObservers() { for (Observer o : mObservers) { o.update(this); } } public interface Observer { void update(Subject subject); } } 测试 Subject subject = new Subject(); subject.setState(0); Subject.Observer so = System.out::println; subject.addObserver(so); subject.setState(1); subject.removeObserver(so); subject.setState(2); State: 1 实现源码 https://github.com/qianbinbin/DesignPattern/tree/master/src/main/java/io/binac/designpattern/observer …
命令模式 Command Pattern
2020-03-13
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。 对这个设计模式的解读,网上一些文章存在误区。 实例 参与者 Receiver 接收者,知道如何实施与执行一个请求相关的操作。命名有误导性,有些文章把 Receiver 设计成接口,把它当成了类似观察者的角色,事实上 Receiver 应该是最终执行操作的类,任何类都可能作为一个接收者 …
代理模式 Proxy Pattern
2020-03-10
客户端不能或不想直接使用一个类时,用代理模式可以实现间接使用。 代理模式一般指的是静态代理,即在编译时实现,代理类 SubjectProxy 与被代理的真实类 RealSubject 实现同一个 Subject 接口,SubjectProxy 维护一个 RealSubject 实例,客户端通过 SubjectProxy 来间接使用 RealSubject。 …
享元模式 Flyweight Pattern
2020-03-08
享元模式与其说是一种设计模式,不如说是一种算法思想。将可以共享的对象存储在一个表中以节省内存,而不是每次都重新创建。 例如,Java 中的 Integer 类型对 -128 到 127 的值做了缓存,java.lang.Integer#valueOf(int) 会直接返回缓存的对象。String 则可以保存在常量池中。这些都是典型应用。 …
外观模式 Facade Pattern
2020-03-07
将一个系统划分为若干子系统,有利于降低系统的复杂性,但是会使客户端的调用复杂化。 外观模式将这些子系统封装到一个类中,对客户端屏蔽这些子系统,提供一个高层、简单的接口。这也是我们不自觉就使用过的设计模式,只不过以前可能不知道名字而已。 …
桥接模式 Bridge Pattern
2020-03-06
当一个抽象可以有多个实现时,通常用继承来协调它们。 例如,对于表示形状的抽象类,可以有圆形、矩形等具体实现,但使用的绘图 API 实现可以不同,如果为每种形状类再定义各种 API 的版本,不仅复杂,而且抽象与实现绑定在一起,不能在运行时改变。 …