设计模式——状态模式(State)

代码:GitHub

状态设计模式(酒店入住示例)

0. UML结构图

状态模式UML结构图

1. 酒店入住示例 Code

1.1 房间状态接口

public interface State {

    boolean free();

    boolean book();

    boolean check();

}

1.2 房间空闲状态

public class FreeState implements State {

    @Override
    public boolean free() {
        return true;
    }

    @Override
    public boolean book() {
        return true;
    }

    @Override
    public boolean check() {
        return false;
    }

    @Override
    public String toString() {
        return "FreeState{ 空闲 }";
    }
}

1.3 房间已预定状态

public class BookedState implements State {

    @Override
    public boolean free() {
        return false;
    }

    @Override
    public boolean book() {
        return false;
    }

    @Override
    public boolean check() {
        return true;
    }

    @Override
    public String toString() {
        return "BookedState{ 已被预订 }";
    }
}

1.4 房间已入住状态

public class CheckedState implements State {

    @Override
    public boolean free() {
        return false;
    }

    @Override
    public boolean book() {
        return false;
    }

    @Override
    public boolean check() {
        return false;
    }

    @Override
    public String toString() {
        return "CheckedState{ 已被入住 }";
    }

}

1.5 房间上下文 - 状态处理

public class HomeContext {

    private static final FreeState freeState = new FreeState();
    private static final BookedState bookedState = new BookedState();
    private static final CheckedState checkedState = new CheckedState();

    private State state;

    public HomeContext() {
        this.state = new FreeState();
    }

    public State getState() {
        return state;
    }

    /**
     * 清空房间
     */
    public void free() {
        if (state.free()) {
            state = freeState;
            System.out.println("HomeContext.free: 房间已被清空!");
        } else {
            System.out.println("HomeContext.free: 房间清空失败!");
        }
        printState();
    }

    /**
     * 预订该房间
     */
    public void book() {
        if (state.book()) {
            state = bookedState;
            System.out.println("HomeContext.book: 房间预订成功!");
        } else {
            System.out.println("HomeContext.book: 房间预订失败!");
        }
        printState();
    }

    /**
     * 入住该房间
     */
    public void check() {
        if (state.check()) {
            state = checkedState;
            System.out.println("HomeContext.check: 入住房间成功!");
        } else {
            System.out.println("HomeContext.check: 入住房间失败!");
        }
        printState();
    }

    private void printState() {
        System.out.println(">>>>>>> 当前房间状态: " + state);
    }

}

2. 酒店入住示例 Test

public class StateTest {

    public static void main(String[] args) {
        // 状态模式,只需要管外部操作即可,内部会自动切换状态

        HomeContext context = new HomeContext();
        // 初始是空闲状态
        System.out.println(context.getState());

        // 来人预订房间
        context.book();
        // 再来一个人预订房间
        context.book();

        // 入住房间
        context.check();
        // 再来一个人预订房间
        context.check();
        // 再来一个人入住房间
        context.book();
    }

}
  • 结果打印
    FreeState{ 空闲 }
    HomeContext.book: 房间预订成功!
    >>>>>>> 当前房间状态: BookedState{ 已被预订 }
    HomeContext.book: 房间预订失败!
    >>>>>>> 当前房间状态: BookedState{ 已被预订 }
    HomeContext.check: 入住房间成功!
    >>>>>>> 当前房间状态: CheckedState{ 已被入住 }
    HomeContext.check: 入住房间失败!
    >>>>>>> 当前房间状态: CheckedState{ 已被入住 }
    HomeContext.book: 房间预订失败!
    >>>>>>> 当前房间状态: CheckedState{ 已被入住 }
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值