设计模式之状态模式

来源:互联网 发布:树莓派 php无法安装 编辑:程序博客网 时间:2024/06/06 19:34

概述:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

角色:

  • Context 定义客户感兴趣的接口。 维护一个ConcreteState子类的实例,这个实例定义当前状态
  • State 定义一个接口以封装与Context的一个特定状态相关的行为
  • ConcreteStatesubclasses 每一子类实现一个与Context的一个状态相关的行为
    这里写图片描述
    类图:

实现:
状态接口:

interface State {    //订房    public void bookRoom();    //入住    public void checkInRoom();    //退房    public void checkOutRoom();}

状态的三个实现

/** * 空闲状态 * 能预定 */public class FreeTimeState implements State {    Room room;    public FreeTimeState(Room room){        this.room = room;    }    @Override    public void bookRoom() {        System.out.println("现在是空闲状态,我预定了");        room.setState(room.getBookedDState());    }    @Override    public void checkInRoom() {    }    @Override    public void checkOutRoom() {    }}
/** * 预定状态 * 能入住 */public class BookedState implements State {    Room room;    public BookedState(Room room){        this.room = room;    }    @Override    public void bookRoom() {    }    @Override    public void checkInRoom() {        System.out.println("现在是预定状态,我入住了");        room.setState(room.getCheckInState());    }    @Override    public void checkOutRoom() {    }}
/** * 入住状态 * 能退房 */public class CheckInState implements State {    Room room;    public CheckInState(Room room){        this.room = room;    }    @Override    public void bookRoom() {    }    @Override    public void checkInRoom() {    }    @Override    public void checkOutRoom() {        System.out.println("现在是入住昨状态,我退房了");        room.setState(room.getFreeTimeState());    }}

房间:

ublic class Room {    State freeTimeState;    State bookedDState;    State checkInState;    State state;    public Room(){        freeTimeState = new FreeTimeState(this);        bookedDState = new BookedState(this);        checkInState = new CheckInState(this);        state = freeTimeState;    }    /**     * 预定     */    public void bookRoom() {        state.bookRoom();    }    /**     * 入住     */    public void checkInRoom() {        state.checkInRoom();    }    /**     * 退房     */    public void checkOutRoom() {        state.checkOutRoom();    }    public State getState() {        return state;    }    public void setState(State state) {        this.state = state;    }    public State getFreeTimeState() {        return freeTimeState;    }    public void setFreeTimeState(State freeTimeState) {        this.freeTimeState = freeTimeState;    }    public State getBookedDState() {        return bookedDState;    }    public void setBookedDState(State bookedDState) {        this.bookedDState = bookedDState;    }    public State getCheckInState() {        return checkInState;    }    public void setCheckInState(State checkInState) {        this.checkInState = checkInState;    }}

测试:

public class testState {    public static void main(String[] args) {        Room room = new Room();        room.bookRoom();    //预订        room.checkInRoom();   //入住        room.checkOutRoom();    //预订    }}

打印:
现在是空闲状态,我预定了
现在是预定状态,我入住了
现在是入住昨状态,我退房了

0 0
原创粉丝点击