美文网首页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_ 原创,未经许可,不得转载!

相关文章

  • 状态模式(State)-七十二变

    设计模式文章陆续更新 java单例模式java代理模式java工厂模式 状态模式(State)-老孙七十二变 俺老...

  • 连工厂模式都不知道,别说你会设计模式

    设计模式文章陆续更新 java单例模式java代理模式java状态模式 在Java面向对象编程中,我们通常会new...

  • Java设计模式——状态模式

    Java设计模式之状态模式 这期分享一个行为模式中的状态模式,状态模式是行为模式中的最后几个模式了。希望多多关注交...

  • 设计模式

    Java 设计模式情景分析 ——单例模式 Java 设计模式情景分析——建造者模式 Java 设计模式情景分析——...

  • java/android 设计模式学习笔记(19)---状态模式

    java/android 设计模式学习笔记(19)---状态模式 【备注】只用于个人收藏

  • Java设计模式--状态模式

    和策略模式很类似,只不过策略模式是通过替换的方式改变类的功能,状态模式则是通过改变类的状态修改类的功能。简单实现 ...

  • Java 设计模式(状态模式)

    之前分享了两个 Java 设计模式,今天给大家带来的系列完整的 java 设计模式。为了帮助大家更好理解设计模式,...

  • Java设计模式----状态模式

    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态判断逻辑转移到表示不同状态的一系列类...

  • Java设计模式——状态模式

    状态模式其实没什么好说的,这种设计模式已经不能用简单来形容了,可以说我们从学习Java的时候就已经接触过了状态模式...

  • Java设计模式 - 状态模式

    定义 状态模式,即因状态而定,因状态而产生具体行为。状态模式与策略模式极其相似,但是二者却有着天壤之别。状态模式的...

网友评论

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

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