美文网首页
状态模式-state

状态模式-state

作者: HeJD | 来源:发表于2018-04-02 10:56 被阅读0次

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

这里写图片描述

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;
    }

}

相关文章

  • State模式

    状态模式(State模式) 定义 状态模式,又称状态对象模式(Pattern of Objects for S...

  • State状态模式

    状态模式的核心是将状态抽象为类,然后将状态的改变包含在类中,这样就避免了在client中写出大量的if...els...

  • 状态模式(State)

    结构 模式的组成环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,...

  • 状态模式(State)

    定义允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects fo...

  • 状态模式-state

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类 state是一个接口,定义了基本操作,co...

  • 状态模式(State)

    1、概念 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类,属于行为型模式。 2...

  • 状态模式(State)

    状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。代替大量if el...

  • 状态模式(State)

    参考博客iOS App的设计模式开发中对State状态模式的运用 使用场景: 例子1:按钮来控制一个电梯的状态,一...

  • 状态(State)模式

  • State 状态模式

    设计原则学习笔记 设计模式学习笔记 作用 将一个类在不同状态下的操作组合起来,成为一个类。方便不同状态下的操作切...

网友评论

      本文标题:状态模式-state

      本文链接:https://www.haomeiwen.com/subject/apxvcftx.html