实战java设计模式(二十二)状态模式

1 介绍

类的行为是基于它的状态改变的。

2 例子

该项设计模式适用于那种类的功能方法随着类的状态改变该改变的场景。比如水的三种状态是随着温度的变换而变化的。

2.1 水接口

interface Water {
    void drink();//被喝
    void chew();//被咀嚼
    void steam();//用来蒸
}

2.2 水的三种状态的实现

液体:

//液体
class LiquidState implements Water {
    @Override
    public void drink() {
        System.out.println("喝水");
    }

    @Override
    public void chew() {
        System.out.println("error:液体不能被咀嚼");
    }

    @Override
    public void steam() {
        System.out.println("error:液体不能被用来蒸");
    }
}

固体:

//固体
class SolidState implements Water {

    @Override
    public void drink() {
        System.out.println("error:冰不能被喝");
    }

    @Override
    public void chew() {
        System.out.println("咀嚼冰");
    }

    @Override
    public void steam() {
        System.out.println("error:冰不能被用来蒸");
    }
}

气体:

//气体
class GasState implements Water {

    @Override
    public void drink() {
        System.out.println("error:水蒸气不能用来喝");
    }

    @Override
    public void chew() {
        System.out.println("error:水蒸气不能咀嚼");
    }

    @Override
    public void steam() {
        System.out.println("水蒸气");
    }
}

2.3 一杯具体的水(果汁)

//一杯果汁
class Juice implements Water {
    public Water nowState;//当前状态
    private Water liquidState = new LiquidState();
    private Water gasState = new GasState();
    private Water solidState = new SolidState();

    //设置果汁的温度
    public void setTemperature(int temperature) {
        if (temperature < 0) {
            nowState = solidState;
        } else if (0 <= temperature && temperature < 100) {
            nowState = liquidState;
        } else
            nowState = gasState;
    }

    @Override
    public void drink() {
        this.nowState.drink();
    }

    @Override
    public void chew() {
        this.nowState.chew();
    }

    @Override
    public void steam() {
        this.nowState.steam();
    }
}

这杯果汁的状态是随着温度的变化而变化的。

2.4 测试主类

public class Main {
    public static void main(String[] args) {
        //创建一个果汁类
        Juice juice = new Juice();

        //0度以下变成果汁冰块
        System.out.println("-负20度的果汁-");
        juice.setTemperature(-20);
        juice.chew();
        juice.drink();
        juice.steam();

        //50度的果汁是液体
        System.out.println("-50度的果汁-");
        juice.setTemperature(50);
        juice.chew();
        juice.drink();
        juice.steam();

        //150度的果汁是液体
        System.out.println("-150度的果汁-");
        juice.setTemperature(150);
        juice.chew();
        juice.drink();
        juice.steam();
    }
}

运行结果:

-20度的果汁-
咀嚼冰
error:冰不能被喝
error:冰不能被用来蒸
-50度的果汁-
error:液体不能被咀嚼
喝水
error:液体不能被用来蒸
-150度的果汁-
error:水蒸气不能咀嚼
error:水蒸气不能用来喝
水蒸气

3 总结

3.1 核心角色

  • 状态父类(抽象类、接口):定义了含有状态主体的共有方法。
  • 状态实体:状态父类的实现,在不同的状态实现不同的主体方法。
  • 主体:状态的拥有者,在不同的时候指向不同的代码方法区。

3.2 核心代码结构

状态模式的核心在于对象的功能方法随着状态不同变化而变化,是一簇方法的多态。实现手段就是根据状态的不同把对象指向不同的方法区域。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值