Android开发Java 设计模式

Java设计模式 - 状态模式

2019-03-23  本文已影响2人  a57ecf3aaaf2

定义

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

状态模式和策略模式都可以解决重复冗杂的 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_ 原创,未经许可,不得转载!

上一篇 下一篇

猜你喜欢

热点阅读