设计模式
设计模式分为创建型模式、结构型模式和行为型模式。
创建型模式:创建对象。
结构型模式:把复杂结构分解为多个类,分解的是类本身(包括算法和属性)。
行为型模式:把复杂算法分解到多个类,分解的是算法。
行为型模式 - 状态模式
状态模式的设计思想来源于有限状态机的概念,即一个系统可以在不同条件触发时在不同状态之间转化。
UML 图
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class StatePattern { public static void main(String[] args) { Context context = new Context(); context.setState(new ConcreteStateA()); context.request(); context.request(); context.request(); } }
interface State { void handle(Context context); }
class ConcreteStateA implements State { @Override public void handle(Context context) { System.out.println("ConcreteStateA"); context.setState(new ConcreteStateB()); } }
class ConcreteStateB implements State { @Override public void handle(Context context) { System.out.println("ConcreteStateB"); context.setState(new ConcreteStateA()); } }
class Context { private State state;
public void setState(State state) { this.state = state; }
public void request() { state.handle(this); } }
|
输出
1 2 3
| ConcreteStateA ConcreteStateB ConcreteStateA
|
应用实例
在写一个播放器逻辑的时候,通过状态模式可以实现播放器的状态转换。
状态模式和策略模式
本质上状态模式和策略模式都是基于组合而非继承的模式,将可变的算法分离成单独的类,通过接口去调用它们。它们的区别就在于状态模式多一个状态转换。
状态模式的 Client 代码:
1 2 3 4 5 6 7 8 9
| public class StatePattern { public static void main(String[] args) { Context context = new Context(); context.setState(new ConcreteStateA()); context.request(); context.request(); context.request(); } }
|
策略模式的 Client 代码:
1 2 3 4 5 6
| public class StrategyPattern { public static void main(String[] args) { Context context = new Context(new ConcreteStrategyA()); context.contextInterface(); } }
|