设计模式20——状态模式

  1. 状态模式的定义 

    Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.(当一个对象的状态改变时允许其改变行为,这个对象看起来像改变了其类)
  2. 状态模式的应用 

    1. 状态模式的优点 

      结构清晰:避免了过多的switch...case 或者if...else语句的使用,避免了程序的复杂性,提高系统的可维护性。

      遵循设计原则:很好的体现了开闭原则和单一职责,每个状态都是一个子类,你要增加状态就增加子类,你要修改状态,你只修改一个子类就可以了。

      封装性非常好:这也是状态模式的基本要求,状态变换放置到类的内部实现,外部的调用不用知道类内部如何实现状态的切换和行为的变换。

    2. 访问者模式的缺点 

      子类会太多,也就是类膨胀,如果一个事物有很多状态也不稀奇,如果完全使用状态模式会有太多的子类,不好管理。
    3. 状态模式的使用场景。

      行为随状态改变而改变的场景:这也是状态模式的根本出发点,例如权限设计、人员的状态不同即使执行相同的行为结果也会不同在这种情况下需要考虑使用状态模式条件、分支判断语句的替代者:在程序中大量使用switch语句或if判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好的避免这一问题,它通过扩展子类实现了条件的判断处理。 
  3. 状态模式的实现

    /**
     * 抽象环境角色
     */
    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();
    }
    
    
    /**
     * 环境角色
     */
    public class ConcreteState1 extends State {
    
        public void handle1() {
            //本状态下必须处理的逻辑
        }
    
        public void handle2() {
    
            //设置当前状态为state2
            super.context.setCurrentState(Context.STATE2);
    
            //过渡到state2状态,由Context实现
            super.context.handle2();
    
        }
    }
    
    /**
     * 环境角色
     */
    public class ConcreteState2 extends State {
        public void handle1() {
            //设置当前状态为state1
            super.context.setCurrentState(Context.STATE1);
    
            //过渡到state1状态,由Context实现
            super.context.handle1();
    
        }
    
        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();
    
    
        }
    
    }

  4. 状态模式源码中的应用

    1. WIFI管理就是使用了状态模式

/**
 * WifiController is the class used to manage on/off state of WifiStateMachine for various operating
 * modes (normal, airplane, wifi hotspot, etc.).
 */
public class WifiController extends StateMachine {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值