设计模式:状态模式-state

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类

这里写图片描述

state是一个接口,定义了基本操作,concreteState是不同状态,其中的方法表示在当前状态下,不同操作的实现。context中,通过改变state来使得调用不同状态的方法

优点

  1、封装了转换规则。
  2、枚举可能的状态,在枚举状态之前需要确定状态种类。
  3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
  4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。
  5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点

  1、状态模式的使用必然会增加系统类和对象的个数。
  2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
  3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。

模式适用场景

 1、对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
 2、代码中包含大量与对象状态有关的条件语句

代码

Main

public class Main {

    public static void main(String[] args) {
        Room room=new Room();
        System.out.println("===预定房间====");
        room.bookRoom();
        System.out.println("====入住====");
        room.checkIn();
        System.out.println("====退房====");
        room.checkOut();

        Room room01=new Room();
        System.out.println("====直接退房=====");
        room01.checkOut();
        System.out.println("=====直接退订=====");
        room01.unsubscribe();
        System.out.println("====直接入住====");
        room01.checkIn();
    }

}

interface:State

public interface State {
    public boolean bookRoom();
    public boolean unsubscribeRoom();
    public boolean checkIn();
    public boolean checkOut();
}

imp:Room

public class Room {

    State free,booked,checkIn;
    State state;

    public Room(){
        free=new free(this);
        booked=new booked(this);
        checkIn=new checkIn(this);

        state=free;

        System.out.println(free);
        System.out.println(booked);
        System.out.println(checkIn);
        System.out.println(state);
    }

    public State getFree() {
        return free;
    }

    public void setFree(State free) {
        this.free = free;
    }

    public State getBooked() {
        return booked;
    }

    public void setBooked(State booked) {
        this.booked = booked;
    }

    public State getCheckIn() {
        return checkIn;
    }

    public void setCheckIn(State checkIn) {
        this.checkIn = checkIn;
    }

    public State getState() {
        return state;
    }

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

    public boolean bookRoom(){
        state.bookRoom();
        return true;
    }
    public boolean unsubscribe(){
        state.unsubscribeRoom();
        return true;
    }
    public boolean checkIn(){
        state.checkIn();
        return true;
    }
    public boolean checkOut(){
        state.checkOut();
        return true;
    }

}

imp:booked

public class booked implements State {

    private Room roomManager;

    public booked(Room roomManager) {
        this.roomManager=roomManager;
    }

    @Override
    public boolean bookRoom() {
        System.out.println("已被预订");
        return false;
    }

    @Override
    public boolean unsubscribeRoom() {
        System.out.println("退订成功");
        roomManager.setState(roomManager.getFree());
        return true;
    }

    @Override
    public boolean checkIn() {
        System.out.println("入住成功");
        roomManager.setState(roomManager.getCheckIn());
        return true;
    }

    @Override
    public boolean checkOut() {
        System.out.println("尚未入住");
        return false;
    }

}

imp:checkIn

public class checkIn implements State {

    private Room roomManager;

    public checkIn(Room roomManager) {
        this.roomManager=roomManager;
    }

    @Override
    public boolean bookRoom() {
        System.out.println("已有入住");
        return false;
    }

    @Override
    public boolean unsubscribeRoom() {
        System.out.println("已有入住");
        return false;
    }

    @Override
    public boolean checkIn() {
        System.out.println("已有入住");
        return false;
    }

    @Override
    public boolean checkOut() {
        System.out.println("退房成功");
        roomManager.setState(roomManager.getFree());
        return true;
    }

}

imp:free

public class free implements State {

    private Room roomManager;


    public free(Room roomManager) {
        this.roomManager=roomManager;
    }

    @Override
    public boolean bookRoom() {
        System.out.println("预定成功");
        roomManager.setState(roomManager.getBooked());
        return true;
    }

    @Override
    public boolean unsubscribeRoom() {
        System.out.println("尚未预定");
        return false;
    }

    @Override
    public boolean checkIn() {
        System.out.println("入住成功");
        roomManager.setState(roomManager.getCheckIn());
        return true;
    }

    @Override
    public boolean checkOut() {
        System.out.println("尚未入住");
        return false;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值