Java设计模式--状态模式

1 State Pattern 状态模式

目的:使类的行为能够因为它状态的改变而改变;
实现:将行为类私有属性–不同状态(可以理解为条件)抽出来成为一个类,通过改变这个状态类来影响行为类的行为。

1.在代码中包含大量与对象状态有关的条件语句时使用;
2.对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为;
3.允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

2 实现

代码场景:糕点师会通过冰箱调解温度,使水呈现出不同的状态,来制作不同的饮品。

2.1 代码实现

抽象状态角色:AbstractWaterState类

public abstract class AbstractWaterState {
    public abstract void makeDrink(IceBox iceBox);
}

具体状态角色:液态水 WaterState类

public class WaterState extends AbstractWaterState {

    @Override
    public void makeDrink(IceBox cookroom) {
        cookroom.setState(this);
        System.out.println("糕点师决定用水做一杯芒果果汁~");
    }
}

具体状态角色:霜 FrostState类

public class FrostState extends AbstractWaterState {

    @Override
    public void makeDrink(IceBox cookroom) {
        cookroom.setState(this);
        System.out.println("糕点师决定用霜做一杯水果补丁雪糕~");
    }
}

具体状态角色:冰 IceState

public class IceState extends AbstractWaterState {

    @Override
    public void makeDrink(IceBox cookroom) {
        cookroom.setState(this);
        System.out.println("糕点师决定用冰做一份老酸奶炒冰片~");
    }
}

上下文角色:冰箱 IceBox类

public class IceBox {
    private AbstractWaterState state;

    public AbstractWaterState getState() {
        return state;
    }

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

}

2.2 涉及角色

在状态模式结构图中包含如下几个角色:

Context(环境类):环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类 State 的实例,这个实例定义当前状态,在具体实现时,它是一个 State 子类的对象。

State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。

ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。

2.3 调用

调用者:

public class Client {
    public static void main(String[] args) {
        // 上下文角色 冰箱
        IceBox iceBox = new IceBox();
        System.out.println("状态变化:当前冰箱温度为5度,水成液态状态~");
        // 水状态为液体
        WaterState water = new WaterState();
        water.makeDrink(iceBox);

        System.out.println("状态变化:当前冰箱温度为-2度,水变成霜~");
        // 水状态为霜
        FrostState snow = new FrostState();
        snow.makeDrink(iceBox);

        System.out.println("状态变化:当前冰箱温度为-15度,水变成了冰冻状态~");
        // 水状态为冰冻
        IceState ice = new IceState();
        ice.makeDrink(iceBox);

    }
}

结果:

状态变化:当前冰箱温度为5度,水成液态状态~
糕点师决定用水做一杯芒果果汁~
状态变化:当前冰箱温度为-2度,水变成霜~
糕点师决定用霜做一杯水果补丁雪糕~
状态变化:当前冰箱温度为-15度,水变成了冰冻状态~
糕点师决定用冰做一份老酸奶炒冰片~

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值