设计模式:状态模式-state

来源:互联网 发布:lumia950xl安装linux 编辑:程序博客网 时间:2024/05/16 11:19

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

这里写图片描述

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