设计模式
设计模式分为创建型模式、结构型模式和行为型模式。
创建型模式:创建对象。
结构型模式:把复杂结构分解为多个类,分解的是类本身(包括算法和属性)。
行为型模式:把复杂算法分解到多个类,分解的是算法。
行为型模式 - 状态模式
状态模式的设计思想来源于有限状态机的概念,即一个系统可以在不同条件触发时在不同状态之间转化。
UML 图
示例代码
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);
}
}
输出
ConcreteStateA
ConcreteStateB
ConcreteStateA
应用实例
在写一个播放器逻辑的时候,通过状态模式可以实现播放器的状态转换。
状态模式和策略模式
本质上状态模式和策略模式都是基于组合而非继承的模式,将可变的算法分离成单独的类,通过接口去调用它们。它们的区别就在于状态模式多一个状态转换。
状态模式的 Client 代码:
public class StatePattern {
public static void main(String[] args) {
Context context = new Context();
context.setState(new ConcreteStateA()); // 多一个状态转换
context.request();
context.request();
context.request();
}
}
策略模式的 Client 代码:
public class StrategyPattern {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.contextInterface();
}
}