美文网首页Android开发Java 设计模式
Java设计模式 - 状态模式

Java设计模式 - 状态模式

作者: a57ecf3aaaf2 | 来源:发表于2019-03-23 21:43 被阅读2次

    定义

    状态模式,即因状态而定,因状态而产生具体行为。状态模式与策略模式极其相似,但是二者却有着天壤之别。状态模式的行为是并列平行存在的,每一个状态都包含所有状态下并行的行为,而策略模式的行为是独立可替换的。

    状态模式和策略模式都可以解决重复冗杂的 if else 语句结构,当一个对象的行为取决于它的状态时,便可以使用状态模式解决。

    示例

    空调的状态包括关机、开机等状态,在不同的状态下某些操作有着不同的行为特征。首先定义一个空调状态基类:

    public abstract class AirState {
    
        protected AirController controller;
    
        public abstract void powerOn();
    
        public abstract void powerOff();
    
        public abstract void adjustTemp();
    
        public void setController(AirController controller) {
            this.controller = controller;
        }
    }
    

    关机状态下进行开机、关机、调节温度等操作:

    public class ClosedState extends AirState {
    
        @Override
        public void powerOn() {
            controller.setCurrentState(AirController.STATE_OPEN);
            controller.getCurrentState().powerOn();
    
            System.out.println("当前状态为启动状态");
        }
    
        @Override
        public void powerOff() {
            System.out.println("已关闭空调");
        }
    
        @Override
        public void adjustTemp() {
            // no-op
        }
    }
    

    开机状态下同样要处理这几种行为:

    public class OpenState extends AirState {
    
        @Override
        public void powerOn() {
            System.out.println("已启动空调");
        }
    
        @Override
        public void powerOff() {
            controller.setCurrentState(AirController.STATE_CLOSED);
            controller.getCurrentState().powerOff();
    
            System.out.println("当前状态为关闭状态");
        }
    
        @Override
        public void adjustTemp() {
            System.out.println("已调整温度");
        }
    }
    

    遥控器的角色,就是要控制空调在不同的状态下的行为:

    public class AirController {
    
        public static final OpenState STATE_OPEN = new OpenState();
        public static final ClosedState STATE_CLOSED = new ClosedState();
    
        private AirState currentState = STATE_CLOSED;
    
        public AirController() {
            this.currentState.setController(this);
        }
    
        public AirState getCurrentState() {
            return currentState;
        }
    
        public void setCurrentState(AirState currentState) {
            this.currentState = currentState;
            currentState.setController(this);
        }
    
        public void powerOn() {
            currentState.powerOn();
        }
    
        public void powerOff() {
            currentState.powerOff();
        }
    
        public void adjustTemp() {
            currentState.adjustTemp();
        }
    }
    
    public class Client {
    
        public static void main(String[] args) {
    
            AirController controller = new AirController();
    
            controller.powerOn();
    
            controller.adjustTemp();
    
            controller.powerOff();
    
            controller.adjustTemp();
        }
    }
    

    最后打印出的结果如下:

    已启动空调
    当前状态为启动状态
    已调整温度
    已关闭空调
    当前状态为关闭状态
    

    Android 中的状态模式场景

    比如用户登录系统,在登录和注销的情况下发表评论、收藏等行为有着不同执行轨迹。类似这些需要根据状态进行不同操作的系统业务逻辑,都可以使用状态模式解决。

    总结

    优点 不言而喻,使得代码结构更加清晰、提高代码扩展性和可维护性。
    缺点 产生了过多的对象和方法,当状态对象和行为的数量双向增长时,必然会导致大量的冗余。

    本文由 Fynn_ 原创,未经许可,不得转载!

    相关文章

      网友评论

        本文标题:Java设计模式 - 状态模式

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