状态模式
来源:互联网 发布:python pipeline 编辑:程序博客网 时间:2024/05/18 22:10
状态模式
定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
角色:- context应用环境:内部持有多个state的引用以及代表当前状态的应用
- state状态接口:定义了所有具体状态的共同接口,任何状态都要实现这个接口,以便,状态之间相互替代。
- concreteState具体状态:处理来自context的请求,每个concreteState都提供了自己对于请求的实现,所有,当context改变状态是,行为也会跟着改变。
- 它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
- 它使得状态转换显式化
- State对象可被共享
- 状态模式的使用必然会增加系统类和对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
- 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
- 代码中包含大量与对象状态有关的条件语句
- 两者类图相同。
- 两者意图不同。
状态模式中,context的行为可以委托到所有状态中的任意一个,一般地,当前状态会自发地再各个状态之间游走(比如:饿,吃饭,到饱),不必context去特意指定。而且,context内会包含多个state的引用。在策略模式中,context通常为了实现某一种算法、策略,会自动指定特定的策略对象。一般,context只包含一个策略对象的引用。 - 一般来说,我们把策略模式想成是除里继承之外的一种弹性替代方案。而把状态模式想成是不用再context中放置许多判断条件的替代方案。
代码示例:
/** * 猪的状态接口 * * @author sky * */public interface PigState {public void eat();public void sleep();}/** * 猪饿的状态 * * @author sky * */public class HungerState implements PigState {private Pig pig;public HungerState(Pig pig) {this.pig = pig;}@Overridepublic void eat() {System.out.println("猪饿了,吃食。。。。。变饱了。");pig.setNowState(pig.getFull());}@Overridepublic void sleep() {System.out.println("猪饿了,睡不着。");}}/** * 猪饱的状态 * * @author sky * */public class FullState implements PigState {private Pig pig;public FullState(Pig pig) {this.pig = pig;}@Overridepublic void eat() {System.out.println("猪很饱,吃不下。");}@Overridepublic void sleep() {System.out.println("猪睡了一觉。。。。又饿了。");pig.setNowState(pig.getHunger());}}/** * 猪 * * @author sky * */public class Pig {private PigState hunger;private PigState full;private PigState nowState;public Pig() {hunger = new HungerState(this);full = new FullState(this);nowState = hunger;}public PigState getNowState() {return nowState;}public void setNowState(PigState nowState) {this.nowState = nowState;}public void eat() {nowState.eat();}public void sleep() {nowState.sleep();}public PigState getHunger() {return hunger;}public PigState getFull() {return full;}}/** * 测试类 * * @author sky * */public class Test {public static void main(String[] args) {Pig pig = new Pig();pig.sleep();pig.eat();pig.eat();pig.sleep();}}输出:猪饿了,睡不着。猪饿了,吃食。。。。。变饱了。猪很饱,吃不下。猪睡了一觉。。。。又饿了。
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- Linkwedo 如何应对 知识型员工的管理
- FineUI学习笔记3
- 网络数据同步开发库libsync
- OpenStack上重装了cinder-volume后无法正常启动
- phpcms v9多文件上传字段获取文件url路径地址的方法
- 状态模式
- I/O多路复用之select
- 在线的 Web 网站性能测试工具
- .net WebService: 如何将 asmx 转化为dll
- Windows驱动程序框架
- UNIX网络编程--socket中的同步/异步 阻塞/非阻塞
- RadioGroup,RadioButton
- google gperf tool【cpu】
- Jquery中筛选表格数据