码迷,mamicode.com
首页 > 其他好文 > 详细

状态模式

时间:2018-05-27 22:46:32      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:设计模式   状态模式   

一. 定义:

    状态模式:当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类

技术分享图片

    抽象状态角色(State):接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换

    环境角色(Context):定义客户端需要的接口,并负责具体状态的切换

    具体状态角色(ConcreteState):每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,即本状态下要做的事情,以及本状态如何过渡到其他状态


//抽象状态角色:接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换
public abstract class State {
/**
* 定义一个环境角色,就是封装状态的变化引起的功能变化,提供子类访问
*/
protected Context context;
public void setContext(Context context) {
this.context = context;
}
//行为1
public abstract void handle1();
//行为2
public abstract void handle2();
}


//具体状态角色1
public class ConcreteState1 extends State{
@Override
public void handle1() {
//本状态下必须处理的逻辑
}
@Override
public void handle2() {
//设置当前状态为state2
super.context.setCurrentState(Context.STATE2);
//过渡到state2状态,由Context实现
super.context.handle2();
}
}
//具体状态角色2
public class ConcreteState2 extends State{
@Override
public void handle1() {
//设置当前状态为state1
super.context.setCurrentState(Context.STATE1);
//过渡到state1状态,由Context实现
super.context.handle1();
}
@Override
public void handle2() {
//本状态下必须处理的逻辑
}


////环境角色
public class Context {
//定义状态
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
//当前状态
private State currentState;
//获得当前状态
public State getCurrentState() {
return currentState;
}
//设置当前状态
public void setCurrentState(State currentState) {
this.currentState = currentState;
//切换状态
this.currentState.setContext(this);
}
//行为委托
public void handle1() {
this.currentState.handle1();
}
public void handle2() {
this.currentState.handle2();
}
}


public class Client {
/**
* 状态模式:当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类
* @param args
*/
public static void main(String[] args) {
//定义环境角色
Context context = new Context2();
//初始化状态
context.setCurrentState(new ConcreteState1());
//行为执行
context2.handle1();
context2.handle2();
}
}


    环境角色约束:

        (1)把状态对象声明为静态常量,有几个状态对象就声明几个静态常量。

        (2)环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式。

二. 状态模式优缺点:

    状态模式优点:

        -- 结构清晰,避免过多的if-else;

        -- 遵循开闭原则和单一原则;

        -- 封装性好。

    状态模式缺点:类膨胀。

三. 状态模式的使用场景及注意事项

    1.使用场景:

        行为随状态改变而改变的场景

        条件、分支判断语句的替代者

    2.注意事项:

        行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不要超过5个。


状态模式

标签:设计模式   状态模式   

原文地址:http://blog.51cto.com/turnsole/2120852

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!