设计模式:状态模式-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
- State(状态)设计模式
- 设计模式----State(状态)模式
- 设计模式----State(状态)模式
- 设计模式--状态模式(State)
- [设计模式]state状态模式
- [设计模式]状态模式 (State)
- 设计模式 -- 状态模式(State)
- 设计模式-状态模式(State)
- 设计模式:状态模式-state
- 设计模式-状态模式State-电梯状态
- 设计模式之State(状态)
- 设计模式----State(状态)
- 设计模式之状态设计模式,state
- 设计模式(3)- 状态设计模式State
- 设计模式(17)-状态模式(State)
- 设计模式之state状态模式
- 设计模式 - State Pattern(状态模式)
- 设计模式 - State Pattern(状态模式)
- 搜索回形取数
- 设置linux ssh 连接超时时间
- invoke的使用
- 变量的命名,变量的定义,变量的初始化
- [Leetcode] Rotate List
- 设计模式:状态模式-state
- linux安装交叉编译环境
- win7 64位系统下载
- 送快递
- GCC在C语言中内嵌汇编 asm
- Android中获取控件的宽和高
- python自定义函数实现最大值的输出
- Android-->如何让普通View具有checked属性(背景xml支持checked状态)
- strcpy相关常见面试问题【1】