美文网首页
设计模式之状态模式

设计模式之状态模式

作者: 古月沧澜 | 来源:发表于2019-04-11 14:09 被阅读0次

    案列

    电梯在不同状态下的业务逻辑以及状态的切换

    设计图

    代码

    1.抽象状态类

    /**
     * Created by Administrator on 2019/4/6.
     * 电梯状态抽象类,定义状态的模板方法,引用电梯的上下文环境类实现类的状态的切换。
     */
    public abstract class IliftState {
    
        protected StateContext stateContext;
    
    
        public void setStateContext(StateContext stateContext) {
            this.stateContext = stateContext;
        }
    
        public abstract void stop();
        public abstract void start();
        public abstract void open();
        public abstract  void close();
    
    
    }
    

    2.开启状态

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class OpenState extends IliftState {
        @Override
        public void stop() {
    
        }
    
        @Override
        public void start() {
    
        }
    
        @Override
        public void open() {
           System.out.println("电梯打开");
        }
    
        @Override
        public void close() {
          super.stateContext.setLiftState(StateContext.closeState);
          super.stateContext.close();
        }
    }
    

    3.关闭状态

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class CloseState extends IliftState{
        @Override
        public void stop() {
            super.stateContext.setLiftState(StateContext.stopState);
            super.stateContext.stop();
        }
    
        @Override
        public void start() {
            super.stateContext.setLiftState(StateContext.startState);
            super.stateContext.start();
        }
    
        @Override
        public void open() {
            super.stateContext.setLiftState(StateContext.openState);
            super.stateContext.open();
        }
    
        @Override
        public void close() {
            System.out.println("电梯关门了");
        }
    }
    
    

    4.启动状态

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class StartState extends IliftState{
        @Override
        public void stop() {
            super.stateContext.setLiftState(StateContext.stopState);
            super.stateContext.stop();
        }
    
        @Override
        public void start() {
             System.out.println("电梯启动了");
        }
    
        @Override
        public void open() {
    
        }
    
        @Override
        public void close() {
    
        }
    }
    
    

    5.停止状态

    /**
     * Created by Administrator on 2019/4/6.
     * 停止状态,可切换到开启状态、关闭状态和启动状态
     */
    public class StopState extends IliftState{
        @Override
        public void stop() {
            System.out.println("电梯停了");
        }
    
        @Override
        public void start() {
            super.stateContext.setLiftState(StateContext.startState);
            super.stateContext.start();
        }
    
        @Override
        public void open() {
            super.stateContext.setLiftState(StateContext.openState);
            super.stateContext.open();
        }
    
        @Override
        public void close() {
            super.stateContext.setLiftState(StateContext.closeState);
            super.stateContext.close();
        }
    }
    

    5.状态环境类

    /**
     * Created by Administrator on 2019/4/6.
     * 状态模式的环境角色类,负责状态切换,类似于工作流中的状态机。
     * 状态机会实现状态类中的所有方法,具体实现委托给对应的状态实现。
     * 默认会给一个初始状态
     */
    public class StateContext {
        public final static StopState stopState=new StopState();
        public final static StartState startState=new StartState();
        public final static OpenState openState=new OpenState();
        public final static CloseState closeState=new CloseState();
    
        //需要初始化一个状态
        private IliftState liftState;
    
    
        public IliftState getLiftState() {
            return liftState;
        }
    
        public void setLiftState(IliftState liftState) {
            this.liftState = liftState;
            //切换状态的依赖,将环境传递到各个状态的类中去。
            this.liftState.setStateContext(this);
        }
    
        public void stop(){
            liftState.stop();
        }
    
        public void start(){
            liftState.start();
        }
    
        public void close(){
            liftState.close();
        }
    
        public void open(){
            liftState.open();
        }
    }
    
    

    6.场景类

    /**
     * Created by Administrator on 2019/4/6.
     * 状态模式只有一个问题,就是类膨胀的问题,其他的都封装的听会挺好。
     * 封装状态的变化,状态的变化,
     */
    public class Client {
    
        public static void main(String[]args){
            StateContext stateContext=new StateContext();
            stateContext.setLiftState(new CloseState());
            stateContext.close();
            stateContext.start();
            stateContext.stop();
            stateContext.open();
        }
    }
    

    7.运行结果

    电梯关门了
    电梯启动了
    电梯停了
    电梯打开
    

    通用类图

    1.含义:

    对象的行为随着状态的变化而变化

    2.设计图
    3.角色说明

    抽象状态类:引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理
    具体状态类:实现抽象状态类,定义具体的几种状态
    状态环境类:引入所有的具体状态,默认实现抽象状态类的所有方法,实现委托给具体的状态类,实现状态的切换。

    4.代码

    1.抽象状态类

    /**
    * Created by Administrator on 2019/4/6.
    * 抽象状态类,引入状态环境类,定义两个方法,分别为本状态行为管理和趋向行为管理。
    */
    public abstract class AbstractState {
       protected StateContext stateContext;
    
       public void setStateContext(StateContext stateContext) {
           this.stateContext = stateContext;
       }
    
       public abstract void handle1();
       public abstract void handle2();
    }
    

    2.具体状态1

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class ConcreteState1 extends AbstractState{
        @Override
        public void handle1() {
            //本状态行为管理
        }
    
        @Override
        public void handle2() {
          super.stateContext.setAbstractState(StateContext.concreteState2);
          super.stateContext.handle2();
        }
    }
    

    3.具体状态2

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class ConcreteState2  extends AbstractState {
        @Override
        public void handle1() {
            super.stateContext.setAbstractState(StateContext.concreteState1);
            super.stateContext.handle1();
        }
    
        @Override
        public void handle2() {
            //本状态行为管理
        }
    }
    

    4.状态环境类

    /**
     * Created by Administrator on 2019/4/6.
     */
    public class StateContext {
    
        //状态对象默认为fianl和static的。
        public    final static ConcreteState1 concreteState1=new ConcreteState1();
        public    final static ConcreteState2 concreteState2=new ConcreteState2();
    
    
        private AbstractState abstractState;
    
        public AbstractState getAbstractState() {
            return abstractState;
        }
    
        public void setAbstractState(AbstractState abstractState) {
            this.abstractState = abstractState;
            this.abstractState.setStateContext(this);
        }
    
        //默认实现状态中的所有方法,具体实现委托给状态类
        public  void handle1(){
            abstractState.handle1();
        };
        public  void handle2(){
            abstractState.handle2();
        };
    }
    

    优势

    1.易扩展

    使用场景

    使用

    相关文章

      网友评论

          本文标题:设计模式之状态模式

          本文链接:https://www.haomeiwen.com/subject/isqtwqtx.html