08 状态模式 state

红绿灯, 根据不同的状态有不同的行为

类似 策略模式, 一个接口封装的是策略,然后不同的策略(类)实现这个接口

这里是, 一个接口封装的是状态,然后不同的状态(类)实现这个接口

参考 设计模式重点版 常用 10 中的.

用于解决系统中复杂对象的状态转换, 需要多外输出不同的行为

主要对象

Context环境类, 聚合维护一个 State 对象,它定义了当前状态

State 一个接口: 封装了一个抽象行为 Handle()

ConcreteState 具体状态类, 每一个类封装了一个状态对应的行为(与 Context 的一个状态的相关行为).

举例: 一个 APP 抽奖获得

 这样的话, 相当于每一个状态都是一个类.

代码有点麻烦, 还是用灯的例子吧 

灯的例子, 开, 关 两种状态

package com.leon.design;

public abstract class State {
    public abstract void switchButton(LightContext lc);
}

package com.leon.design;

public class OnState extends State {

    @Override
    public void switchButton(LightContext lc) {
        System.out.println("现在light是开状态, 关闭了电灯...");
        lc.currentState = lc.offState;
    }

}

package com.leon.design;

public class OffState extends State {

    @Override
    public void switchButton(LightContext lc) {
        System.out.println("现在light是关闭状态, 打开了电灯...");
        lc.currentState = lc.onState;
    }

}

package com.leon.design;

public class LightContext {
    State currentState;
    
    State onState = new OnState();
    State offState = new OffState();
    
    public LightContext() {
        this.currentState = offState;
    }
    
    public void DoClike() {
        currentState.switchButton(this);
    }
    
}

package com.leon.design;

public class StateClient {

    public static void main(String[] args) {
        
        LightContext lc = new LightContext();
        for (int i = 0; i < 3; i++) {
            lc.DoClike();
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/moveofgod/p/12542401.html