【状态模式 例子】
package com.Higgin.State; /** * 水的状态 */ interface WaterState{ public void printState(); } /** * 固态水 */ class SolidWaterState implements WaterState{ @Override public void printState() { System.out.println("0°C以下,水是固态的..."); } } /** * 液态水 */ class LiquidWaterState implements WaterState{ @Override public void printState() { System.out.println("0°C~100°C之间,水是液态的..."); } } /** * 气态水 */ class GasWaterState implements WaterState{ @Override public void printState() { System.out.println("100°C以上,水是气态的..."); } } /** * 水状态的上下文类 */ class WaterContext{ private WaterState waterState; public void setState(int temp){ if(temp<=0){ //温度小于等于0°C,初始化为固态 waterState=new SolidWaterState(); }else if(temp>=100){ //温度在0~100°C之间,初始化为液态 waterState=new GasWaterState(); }else{ //温度在100°C及以上,初始化为气态 waterState=new LiquidWaterState(); } } //得到当前 水的具体状态类 public WaterState getState(){ return this.waterState; } } public class TestState { public static void main(String[] args) { WaterContext wc=new WaterContext(); wc.setState(18); WaterState ws=wc.getState(); ws.printState(); } }
【运行结果】
【 策略模式 与 状态模式 区别!!】
* 封装的不同
[ 策略模式 ]封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的。
[ 状态模式 ]封装的是不同的状态,以达到状态岁切换行为随之发生改变的目的。
两者都有变换的行为,但是两者的目标是不同的。
* 环境角色的职责不同。(两者都有一个Context环境角色类,或上下文类)
[ 策略模式 ]旨在解决内部算法如何改变的问题,即将内部算法的改变对外界的影响降低到最小,保证算法的可自由切换。
[ 状态模式 ]对外暴露的是行为,状态的变化一般由环境角色和具体的状态共同完成的,也就是说状态模式封装了状态的变化而暴露了不同的行为或行为结果。
* 应用场景的不同
[ 策略模式 ]是一系列平行的、可以相互替换的算法封装后的结构。
[ 状态模式 ]则要求有一系列变化的场景,他要求是有状态且有行为的场景,如果只有状态而没有行为,则状态的变化就是去了意义。
* 复杂度不同
[ 策略模式 ]结构较为简单,扩展比较容易,代码较为容易阅读。
[ 状态模式 ]一般较为复杂,因为它需要从两个角色看到一个对象状态和行为的改变,也就是说它封装的是变化。
时间: 2024-10-03 22:25:06