23种设计模式-java-状态

本文通过一个彩灯控制的例子介绍了状态模式的应用,彩灯在push和pull操作下会改变颜色(red->green->blue->red),同时亮度也会相应增减。状态模式使得在对象状态变化时能灵活地切换行为,避免了大量条件语句的使用,提高了代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式概述:

让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。状态模式与有限状态机的概念紧密相关。

使用场景:

1.如果对象需要根据自身当前状态进行不同行为, 同时状态的数量非常多且与状态相关的代码会频繁变更的话, 可使用状态模式。
2. 如果某个类需要根据成员变量的当前值改变自身行为, 从而需要使用大量的条件语句时, 可使用该模式。
3. 当相似状态和基于条件的状态机转换中存在许多重复代码时, 可使用状态模式。、

代码样例:

/**
 * 彩灯
 *
 * 背景:彩灯有两个功能按钮,一个是push,一个是pull,按下按钮会切换灯的颜色(状态)
 * 状态:red,green,blue
 * push:red->green->blue->red
 * pull:red->blue->green->red
 */
public class Lamp {
    private String color;//颜色
    private Long brightness =10L;//亮度
    private State state;

    public Lamp() {
        State state = new RedState(this);//初始redState
        this.state = state;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Long getBrightness() {
        return brightness;
    }

    public void setBrightness(Long brightness) {
        if(brightness <= 0L){
            this.brightness = 0L;
        }else if(brightness >= 100L){
            this.brightness = 100L;
        }else{
            this.brightness = brightness;
        }
    }



    public void push(){
        state.handlePush();
        System.out.println("当前颜色是:"+this.color+"========当前亮度是:"+this.brightness);
    }

    public void pull(){
        state.handlePull();
        System.out.println("当前颜色是:"+this.color+"========当前亮度是:"+this.brightness);
    }
}
/**
 * 状态接口
 */
public interface State {
    void handlePush();
    void handlePull();
}
/**
 * redState
 *
 * push:red->green->blue->red
 * pull:red->blue->green->red
 */
public class RedState  implements State{
    private Lamp lamp;

    public RedState(Lamp lamp) {
        this.lamp = lamp;
        this.lamp.setColor("red");
    }

    @Override
    public void handlePush() {
        lamp.setState(new GreenState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
    }

    @Override
    public void handlePull() {
        lamp.setState(new BlueState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
    }
}
/**
 * greenState
 *
 * push:red->green->blue->red
 * pull:red->blue->green->red
 */
public class GreenState implements State{
    private Lamp lamp;

    public GreenState(Lamp lamp) {
        this.lamp = lamp;
        this.lamp.setColor("green");
    }

    @Override
    public void handlePush() {
        lamp.setState(new BlueState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
    }

    @Override
    public void handlePull() {
        lamp.setState(new RedState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
    }
}
/**
 * blueState
 *
 * push:red->green->blue->red
 * pull:red->blue->green->red
 */
public class BlueState implements State{
    private Lamp lamp;

    public BlueState(Lamp lamp) {
        this.lamp = lamp;
        this.lamp.setColor("blue");
    }

    @Override
    public void handlePush() {
        lamp.setState(new RedState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
    }

    @Override
    public void handlePull() {
        lamp.setState(new GreenState(lamp));//状态切换
        lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
    }
}
/**
 * 测试状态
 */
public class TestState {
    public static void main(String[] args) {
        Lamp lamp = new Lamp();
        lamp.push();
        lamp.push();
        lamp.pull();
        lamp.pull();
        lamp.pull();
        lamp.pull();
        lamp.push();
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值