头图

状态模式的定义是允许对象通过改变其状态的方式改变它的行为。

状态模式中有以下几种角色

  • 上下文类:用于记录状态、修改状态,行为的调用等
  • 抽象状态类:所有用于表示同一类状态的类的父类,并定义了一个行为接口
  • 具体状态类:不同状态的具体实现

下面是使用状态模式对一个打印机行为的一种实现。

上下文类

public class PrinterContext {
    private PrinterState state;

    public PrinterContext(PrinterState state) {
        this.state = state;
    }

    public PrinterState getState() {
        return state;
    }

    public void setState(PrinterState state) {
        this.state = state;
    }

    public void handle(){
        state.handle(this);
    }
}

抽象状态类

public interface PrinterState {
    void handle(PrinterContext context);
}

具体状态类

public class OccupyState implements PrinterState {
    @Override
    public void handle(PrinterContext context) {
        System.out.println("打印机正在被占用....");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            System.out.println("打印结束,转为空闲模式");
            context.setState(new IdleState());
        }
    }
}
public class IdleState implements PrinterState {

    @Override
    public void handle(PrinterContext context) {
        System.out.println("打印机空闲中.....");
    }
}

测试类

public class StateTest {
    @Test
    public void test(){
        PrinterState occupyState = new OccupyState();
        PrinterContext context = new PrinterContext(occupyState);
        context.handle();
    }
}
=====结果=====
打印机正在被占用....
打印结束,转为空闲模式

状态模式和策略模式很像,用下面的两个时序图很容易看出两者的一些差异。
原文链接


eacape
205 声望8 粉丝

JAVA 攻城狮


« 上一篇
策略模式
下一篇 »
备忘录模式