设计模式之状态设计模式

设计模式Java大约 2264 字

作用

解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。

当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式。

原理

state.png

Context:环境角色,用于维护State实例,这个实例定义当前状态。

State:抽象状态角色,定义一个接口封装与Context的一个特点接口相关行为。

ConcreteState:具体的状态角色,每个子类实现一个与Context的一个状态相关行为。

案例

状态转换关系图

state_transfer.png

Context

public class Raffle {

    int count = 10;

    State state;

    public Raffle(State state) {
        this.state = state;
    }

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

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

State

public interface State {

    void handle(Raffle raffle);

}

ConcreteState

public class NoRaffleState implements State {

    @Override
    public void handle(Raffle raffle) {
        if (raffle.count > 0) {
            System.out.println("NoRaffleState-可以抽奖");
            raffle.setState(new CanRaffleState());
        } else {
            System.out.println("NoRaffleState: 奖品已经领完");
        }
    }
}

public class CanRaffleState implements State {

    @Override
    public void handle(Raffle raffle) {
        System.out.println("CanRaffleState-正在抽奖,请稍等!");
        Random r = new Random();
        int num = r.nextInt(10);
        if (num == 0) {
            System.out.println("CanRaffleState-中奖了!!!!!!");
            raffle.setState(new DispensePrizeState());
        } else {
            System.out.println("CanRaffleState-很遗憾没有抽中奖品!");
            raffle.setState(new NoRaffleState());
        }
    }
}

public class DispensePrizeState implements State {

    @Override
    public void handle(Raffle raffle) {
        if (raffle.count > 0) {
            System.out.println("DispensePrizeState-发奖");
            raffle.count--;
        } else {
            System.out.println("DispensePrizeState-奖品已经领完了");
            raffle.setState(new DispenseOverState());
        }
    }
}

public class DispenseOverState implements State {

    @Override
    public void handle(Raffle raffle) {
        System.out.println("DispenseOverState-奖品已经领完了");
        raffle.setState(new NoRaffleState());
    }
}

调用

public class Client {
    public static void main(String[] args) {
        Raffle raffle = new Raffle(new NoRaffleState());
        raffle.next();
    }
}
阅读 196 · 发布于 2020-01-07

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看换一批