设计模式 - 行为型模式 - 状态模式

56 阅读1分钟

设计模式

设计模式分为创建型模式、结构型模式和行为型模式。
创建型模式:创建对象。
结构型模式:把复杂结构分解为多个类,分解的是类本身(包括算法和属性)。
行为型模式:把复杂算法分解到多个类,分解的是算法。

行为型模式 - 状态模式

状态模式的设计思想来源于有限状态机的概念,即一个系统可以在不同条件触发时在不同状态之间转化。

UML 图

状态模式的 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();
    }
}