状态模式(State)----行为笔记
来源:互联网 发布:php cookie自动登录 编辑:程序博客网 时间:2024/06/06 00:03
【状态模式】(State)当一个对象的内部状态改变时,改变其行为。看起来就好像改变了它的类一样。
一、涉及角色
【抽象状态】(State):状态接口,用于封装 环境对象(Context) 的一个特定状态所对应的行为。
【具体状态】(ConcreteState):具体状态类,封装实现了 环境对象(Context) 状态所对应的行为。
【环境角色】(Context):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。即现有状态。
二、优点与缺点
优点:将状态涉及的业务行为封装在具体状态类,使业务行为局域化。减少条件判断语句。新状态可直接添加,不影响其他代码。
缺点:可能有很多小状态类。
三、何时使用:
一个对象的行为(方法),依赖于它所处的状态。这个行为必须随着状态的改变而改变。
一重或多重条件判断语句,而且条件内的业务代码又较长。
【谁来判定状态的变化?】
1、如果条件是固定的,可由Context角色来做。
2、如果让State子类自行判定下一个状态,和什么时候转换,就更有灵活性。
3、也可以交由外部事件触发状态转移。
4、按需创建状态类,动态创建。
跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。
状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。
http://blog.csdn.net/xxb2008
State角色
public interface State { void rain(); void sun(); void travel(Context context);}
状态1
public class RainState implements State { @Override public void rain() { System.out.println("下雨ing..."); } @Override public void sun() { System.out.println("下雨, 没太阳"); } @Override public void travel(Context context) { rain(); sun(); System.out.println("下雨, 不出去, 等2秒看看"); try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } context.setState(new SunState());//切换状态 }}
状态2
public class SunState implements State { @Override public void rain() { System.out.println("没雨下"); } @Override public void sun() { System.out.println("好大太阳"); } @Override public void travel(Context context) { rain(); sun(); System.out.println("太阳, 出去走走"); }}
Context环境角色
public class Context { State state; public void travel() { state.travel(this); } public State getState() { return state; } public void setState(State state) { this.state = state; } public static void main(String[] args) { Context context = new Context(); context.setState(new RainState()); context.travel(); System.out.println(""); System.out.println("----------"); context.travel(); }}
下雨ing...下雨, 没太阳下雨, 不出去, 等2秒看看----------没雨下好大太阳太阳, 出去走走
0 0
- 状态模式(State)----行为笔记
- 状态模式(State)----行为笔记
- 行为模式:State(状态)
- 行为型模式-----状态模式(State)
- 状态模式state(对像行为)
- 状态模式State(对象行为型)
- 状态模式State(对象行为型)
- [设计模式笔记]三. 行为型模式--22. State模式(状态)对象行为型模式(一)
- 设计模式(十九)状态模式(State)-行为型
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 行为型模式之状态模式(State)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式--状态模式State(行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 八、状态模式State(行为型模式)
- (行为型模式)STATE——状态模式
- 设计模式-行为型- 状态模式(State)
- 状态模式(State Pattern,对象行为型模式)
- Java指令集
- Javap查看Class指令
- Sublime快捷键
- Aio--Java异步IO的 Socket Demo
- JVM虚拟机结构
- 状态模式(State)----行为笔记
- 网站架构5要素--性能
- gmock学习
- linux
- linux find grep组合使用
- 土地问题(求出土地被分成多少面,有知识点)
- linux下的bluetooth编程之环境构筑
- Qt for Android调用android原生Toast控件
- Elasticsearch安装后x-pack插件后使用CRUL