您的位置:首页 > 其它

状态模式(State)----行为笔记

2017-02-22 07:25 260 查看
【状态模式】(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秒看看

----------
没雨下
好大太阳
太阳, 出去走走
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: