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

23种设计模式之状态模式

作者: 阿跳爱学习 | 来源:发表于2019-01-29 19:43 被阅读0次

    优点:避免大量的If/else导致代码臃肿,更灵活、便于维护与扩展。
    缺点:类个数增加,使用不当程序结构会比较混乱。

    主要有以下角色:

    • Context(环境类):环境类种维护了一个State对象,它定义了当前状态。
    • State(抽象状态类):定义具体状态类需要实现的方法。
    • ConcreteState(具体状态类):封装了一个状态对应的行为。

    主要用于解决系统中复杂的状态切换。

    例子:以网上购物为例,从简,只分三个状态:
    1.已发货
    2.送货中
    3.已收货

    创建State抽象状态类:

    /**
     * State(抽象状态类):定义具体状态类需要实现的方法。
     */
    
    public interface State {
        void handle();
    }
    

    创建ConcreteState具体状态类,并实现State 接口:

    import android.util.Log;
    
    /**
     * 1.已发货
     */
    
    public class Shipped implements State {
    
        @Override
        public void handle() {
            Log.d("TAG", "1:已发货");
        }
    }
    
    import android.util.Log;
    
    /**
     * 2.送货中
     */
    
    public class InDelivery implements State {
    
        @Override
        public void handle() {
            Log.d("TAG", "2:送货中");
        }
    }
    
    import android.util.Log;
    
    /**
     * 3.已收货
     */
    
    public class Received implements State{
    
        @Override
        public void handle() {
            Log.d("TAG","3:已收货");
        }
    }
    

    创建Context环境类,环境类种维护了一个State对象,它定义了当前状态:

    import android.util.Log;
    
    /**
     * Context环境类,环境类种维护了一个State对象,它定义了当前状态
     */
    
    public class MyContext {
    
        private State state;
    
        public void setState(State state){
            Log.d("TAG","状态发生改变!");
            this.state = state;
            state.handle();
        }
    }
    

    调用:

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentActivity;
    
    /**
     * 这是调用者
     */
    
    public class MainActivity extends FragmentActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            MyContext context = new MyContext();
            context.setState(new Shipped());
            context.setState(new InDelivery());
            context.setState(new Received());
        }
    }
    
    结果: image.png

    已完成测试!有不对的地方欢迎指出,感恩。

    相关文章

      网友评论

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

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