适配器模式之状态模式

    xiaoxiao2026-02-13  22

    设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox

    状态模式 State Pattern

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

    通用类图

    组成

    抽象状态角色 State 接口或抽象类、负责对象状态定义,并且封装环境角色以实现状态切换具体状态角色 ConcreteState 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗的说,就是本状态下要做的事情,以及本状态如何过渡到其他状态环境角色 Context 定义客户端需要的接口,并且负责具体状态的切换

    通用源码

    JAVA

    //抽象状态角色 public abstract class State{ //定义一个环境角色,提供子类访问 protected Context context; //设置环境角色 public void setContext(Context _context){ this.context=_context; } //行为 public abstract void handle1(); public abstract void handle2(); } //环境角色 public class ConcreteState1 extends State{ @Override public void handle1(){ ... } @Override public void handle2(){ //设置当前状态为STATE2 super.context.setCurrentState(Context.STATE2); //过渡到STATE2状态,由Context实现 super.context.handle2(); } } 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{ public static void main(String[] args){ //定义环境角色 Context context=new Context(); //初始化状态 context.setCurrentState(new ConcreteState1()); //执行行为 context.handle1(); context.handle2(); } }

    优点

    结构清晰 遵循设计原则 封装性好

    使用场景

    行为随状态改变而改变的场景 条件、分支判断语句的替代者

    最新回复(0)