设计模式学习笔记(十)——状态模式

定义: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
分析: 该模式将状态封装为独立的类,并将动作委托到代表当前状态的对象,行为会随着内部状态改变而改变。从客户角度,如果你使用的对象能完全改变它的行为,那么看起来这个对象是从别的类实例化而来的。
UML类图
在这里插入图片描述
State: 所有具体状态的共同接口,因此,状态之间可以互相替换
ConcreteState: 具体状态,处理来自Context的请求,每一个具体状态都提供了它对请求的实现,所以,当context改变时,行为也跟着改变
Context: 上下文,拥有一些内部状态,只要调用request方法,它就会被委托到状态去处理

示例
context:

public class GumballMachine {

    State soldOutState;
    State noQuarterState;
    State hasQuarterState;
    State soldState;

    State state = soldOutState;
    int count = 0;

    public GumballMachine(int numberGumballs){
        soldOutState = new SoldOutState(this);
        noQuarterState = new NoQuarterState(this);
        hasQuarterState = new HasQuarterState(this);
        soldState = new SoldState(this);
        this.count = numberGumballs;
        if(numberGumballs > 0){
            state = noQuarterState;
        }
    }

    public void insertQuarter(){
        state.insertQuarter();
    }

    public void ejectQuarter(){
        state.ejectQuarter();
    }

    public void turnCrank(){
        state.turnCrank();
    }

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

    public void releaseBall(){
        System.out.println("发放糖果");
        if (count != 0){
            count = count -1;
        }
    }

    public State getSoldOutState() {
        return soldOutState;
    }

    public State getNoQuarterState() {
        return noQuarterState;
    }

    public State getHasQuarterState() {
        return hasQuarterState;
    }

    public State getSoldState() {
        return soldState;
    }

    public int getCount() {
        return count;
    }
}

State

public interface State {
    void insertQuarter();

    void ejectQuarter();

    void turnCrank();

    void dispense();
}

ConcreteState

public class HasQuarterState implements State {
    GumballMachine gumballMachine;

    public HasQuarterState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("已经投入过硬币");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("硬币回退");
        gumballMachine.setState(gumballMachine.getNoQuarterState());
    }

    @Override
    public void turnCrank() {
        System.out.println("启动...");
        gumballMachine.setState(gumballMachine.getSoldState());
    }

    @Override
    public void dispense() {
        System.out.println("没有糖果卖出");
    }
}

public class NoQuarterState implements State {
    GumballMachine gumballMachine;

    public NoQuarterState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("请插入硬币");
        gumballMachine.setState(gumballMachine.getHasQuarterState());
    }

    @Override
    public void ejectQuarter() {
        System.out.println("还未投入硬币");
    }

    @Override
    public void turnCrank() {
        System.out.println("转动,但没有硬币");
    }

    @Override
    public void dispense() {
        System.out.println("请先投入硬币");
    }
}

public class SoldOutState implements State {
    GumballMachine gumballMachine;

    public SoldOutState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("无法投入硬币,没货");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("没有投入硬币");
    }

    @Override
    public void turnCrank() {
        System.out.println("没有硬币投入");
    }

    @Override
    public void dispense() {
        System.out.println("没有出货");
    }
}

public class SoldState implements State {
    GumballMachine gumballMachine;

    public SoldState(GumballMachine gumballMachine) {
        this.gumballMachine = gumballMachine;
    }

    @Override
    public void insertQuarter() {
        System.out.println("请稍等,正在出货");
    }

    @Override
    public void ejectQuarter() {
        System.out.println("不好意思,已经启动无法回退");
    }

    @Override
    public void turnCrank() {
        System.out.println("重复操作");
    }

    @Override
    public void dispense() {
         gumballMachine.releaseBall();
         if (gumballMachine.getCount() > 0){
             gumballMachine.setState(gumballMachine.getNoQuarterState());
         } else {
             System.out.println("无货");
             gumballMachine.setState(gumballMachine.getSoldOutState());
         }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值