设计模式--------状态模式

设计模式--------状态模式

介绍状态模式的三大问题

  • 现在的写法有什么问题?

  • 什么是状态模式?

  • 状态模式有什么好处?

采用一个案例来说明问题

  • 现有一个手电筒,手电筒有五种模式,通过按下按钮来进行模式的切换

常见思路

  • 创建一个手电筒类
  • 定义五种手电筒状态,并记录当前状态
  • 通过按钮方法来切换状态并调用相应的方法来执行操作

MyLight


public class MyLight {
    final static int NO_LIGHT = 0;
    final static int LOW_LIGHT = 1;
    final static int NORMAL_LIGHT = 2;
    final static int HIGH_LIGHT = 3;
    final static int FLASH_LIGHT = 4;

    int state = NO_LIGHT;

    public void changeMode() {
        if (state == NO_LIGHT) {
            state = LOW_LIGHT;
            System.out.println("nolight -> lowlight");
        } else if (state == LOW_LIGHT) {
            state = NORMAL_LIGHT;
            System.out.println("lowlight -> normallight");
        } else if (state == NORMAL_LIGHT) {
            state = HIGH_LIGHT;
            System.out.println("lowlight -> normallight");
        } else if (state == HIGH_LIGHT) {
            state = FLASH_LIGHT;
            System.out.println("normallight -> highlight");
        } else if (state == FLASH_LIGHT) {
            state = NO_LIGHT;
            System.out.println("highlight -> flashlight");
        }
    }
}

有什么问题?

  • 所有的状态和动作都在此类中,不易维护
  • 当加入多个动作的时候,需要对每个动作的每种状态都要做出对应的反应,此类会变得非常的长

什么是状态模式

  • 允许对象在内部状态改变时改变他的行为, 让对象看起来好像修改了类
  • 通过让多个状态实现同一接口,用于让状态之间可以切换,Light通过调用当前的状态类的方法实现操作,在状态类中进行状态的变更,以实现下一步的操作

重新改造代码

  • 创建多个状态类
  • 创建状态接口
  • 改造Light类

State

public interface State {
    
    public void press();
}

NoLightState


public class NoLightState implements State {

    Light light;

    public NoLightState(Light light) {
        this.light = light;
    }

    @Override
    public void press() {
        State state = light.getLowLightState();
        light.setState(state);
        System.out.println("nolight -> lowlight");
    }

    
}

LowLightState

public class LowLightState implements State {

    Light light;

    public LowLightState(Light light) {
        this.light = light;
    }


    @Override
    public void press() {
        State state = light.getNormalLigState();
        light.setState(state);
        System.out.println("lowlight -> normallight");

    }
}

NormalLightState

public class NormalLightState implements State {

    Light light;

    public NormalLightState(Light light) {
        this.light = light;
    }

    @Override
    public void press() {
        State state = light.getHighLightState();
        light.setState(state);
        System.out.println("lowlight -> normallight");
    }
    
}

HighLightState

public class HighLightState implements State {
    Light light;

    public HighLightState(Light light) {
        this.light = light;
    }

    @Override
    public void press() {
        State state = light.getFlashLightState();
        light.setState(state);
        System.out.println("normallight -> highlight");

    }
}

FlashLightState

public class FlashLightState implements State {
    Light light;

    public FlashLightState(Light light) {
        this.light = light;
    }

    @Override
    public void press() {
        State state = light.getNoLightState();
        light.setState(state);
        System.out.println("highlight -> flashlight");
    }
    
}

Light

public class Light {
    
    State lowLightState;
    State highLightState;
    State flashLightState;
    State normalLightState;
    State noLightState;
    State state;

    public Light() {
        lowLightState = new LowLightState(this);
        normalLightState = new NormalLightState(this);
        highLightState = new HighLightState(this);
        flashLightState = new FlashLightState(this);
        noLightState = new NoLightState(this);
        state = noLightState;
        
    }

    public State getLowLightState() {
        return lowLightState;
    }
    
    public State getHighLightState() {
        return highLightState;
    }

    public State getFlashLightState() {
        return flashLightState;
    }

    public State getNormalLigState() {
        return normalLightState;
    }

    public void setState(State state) {
        this.state = state;
    }

    public State getNoLightState() {
        return noLightState;
    }
    public void changeMode() {
        state.press();
    }
}

Main

public class App {
    public static void main(String[] args) throws Exception {

        Light light = new Light();
        light.changeMode();
        light.changeMode();
    }
}
// out
nolight -> lowlight
lowlight -> normallight

END

不慕招式,勤修内功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值