设计模式-10 状态模式
2017-04-01 11:09
316 查看
状态模式介绍
状态模式就是在不同的状态下的同一种行为会有不同的结果。他和策略模式的类结构几乎一样。但是却和策略模式有着本质的不同。比如以打铁为例:在状态模式下:那么同样是打铁,当铁的温度在1500度和30度。打铁的行为会对铁造成不同的变化。30度打铁,铁肯定不会有变化,但是1500度将会成钢。那么策略模式下:更注重的是打铁的方式,比如同样是1500度,那么手动打铁和用轧钢厂的机械打铁是两种方式。
状态模式的使用场景
1)一个对象的行为取决于它的状态,并且根据根据不同的状态,其会有不同的结果。
2)当一个类中有根据状态有关的条件语句(if-else switch-case)时。
UML类图
状态模式下的简单示例
电视机开的时候,可以换台,调声音,关闭电视。当电视关闭的时候只能打开电视。按换台键或者声音键都会没有反应。
常规写法
打印结果:
电视机开着的时候可以:======================
电视机已经关闭
已经切换节目
声音已被调大
电视机关闭的时候可以的时候可以:======================
电视机已经被打开
使用状态模式
打印结果
现在电视机处于关闭状态================
电视机已被打开
现在电视机处于开启状态================
电视机已经关闭
已经换台
已经调高声音
由此可见,使用状态模式能够提高代码的扩展性。并且阅读起来更直接明了省去了if-else的判断。对于状态更多的比如三种四种,效果更明显。
状态模式就是在不同的状态下的同一种行为会有不同的结果。他和策略模式的类结构几乎一样。但是却和策略模式有着本质的不同。比如以打铁为例:在状态模式下:那么同样是打铁,当铁的温度在1500度和30度。打铁的行为会对铁造成不同的变化。30度打铁,铁肯定不会有变化,但是1500度将会成钢。那么策略模式下:更注重的是打铁的方式,比如同样是1500度,那么手动打铁和用轧钢厂的机械打铁是两种方式。
状态模式的使用场景
1)一个对象的行为取决于它的状态,并且根据根据不同的状态,其会有不同的结果。
2)当一个类中有根据状态有关的条件语句(if-else switch-case)时。
UML类图
状态模式下的简单示例
电视机开的时候,可以换台,调声音,关闭电视。当电视关闭的时候只能打开电视。按换台键或者声音键都会没有反应。
常规写法
public class TvControler { boolean tvIsOn = true; public static void main(String[] args) { TvControler controler = new TvControler(); System.out.println("电视机开着的时候可以:======================"); controler.setTvOn(); controler.setTvOff(); controler.changeChannel(); controler.turnUpVoice(); System.out.println("电视机关闭的时候可以的时候可以:======================"); controler.tvIsOn = false; controler.setTvOn(); controler.setTvOff(); controler.changeChannel(); controler.turnUpVoice(); } /** * 打开电视机 */ private void setTvOn() { if (tvIsOn) { } else { System.out.println("电视机已经被打开"); } } /** * 管壁电视机 */ private void setTvOff(){ if(tvIsOn){ System.out.println("电视机已经关闭"); }else{ } } /** * 换台 */ private void changeChannel(){ if(tvIsOn){ System.out.println("已经切换节目"); }else{ } } /** * 调大声音 */ private void turnUpVoice(){ if(tvIsOn){ System.out.println("声音已被调大"); }else{ } } }
打印结果:
电视机开着的时候可以:======================
电视机已经关闭
已经切换节目
声音已被调大
电视机关闭的时候可以的时候可以:======================
电视机已经被打开
使用状态模式
/** * 定义电视机的所有方法 */ public interface ITvStatus { /** c023 * 打开电视 */ void turnOnTv(); /** * 关闭电视 */ void turnOffTv(); /** * 换台 */ void changeChannel(); /** * 调大声音 */ void turnUpVoice(); }
/** * 电视机处于关闭状态 */ public class TvStatusOff implements ITvStatus{ public void turnOnTv() { System.out.println("电视机已被打开"); } public void turnOffTv() { } public void changeChannel() { } public void turnUpVoice() { } }
/** * 电视机处于开启状态 */ public class TvStatusOn implements ITvStatus{ public void turnOnTv() { } public void turnOffTv() { System.out.println("电视机已经关闭"); } public void changeChannel() { System.out.println("已经换台"); } public void turnUpVoice() { System.out.println("已经调高声音"); } }
public class Context { private ITvStatus tvStatus; public static void main(String[] args) { Context context = new Context(); context.setTvStatus(new TvStatusOff()); System.out.println("现在电视机处于关闭状态================"); context.tvStatus.turnOnTv(); context.tvStatus.turnOffTv(); context.tvStatus.changeChannel(); context.tvStatus.turnUpVoice(); context.setTvStatus(new TvStatusOn()); System.out.println("现在电视机处于开启状态================"); context.tvStatus.turnOnTv(); context.tvStatus.turnOffTv(); context.tvStatus.changeChannel(); context.tvStatus.turnUpVoice(); } public void setTvStatus(ITvStatus tvStatus) { this.tvStatus = tvStatus; } }
打印结果
现在电视机处于关闭状态================
电视机已被打开
现在电视机处于开启状态================
电视机已经关闭
已经换台
已经调高声音
由此可见,使用状态模式能够提高代码的扩展性。并且阅读起来更直接明了省去了if-else的判断。对于状态更多的比如三种四种,效果更明显。
相关文章推荐
- 设计模式学习总结10 - 行为型5 - State状态模式
- 设计模式--[10]状态模式
- 设计模式(10)--状态模式
- Java设计模式(10) —— 状态
- HeadFirst 设计模式 10状态模式(糖果机)
- 初识设计模式 chapter 10-状态模式
- Head First 设计模式 --10 状态模式
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
- C#设计模式(10)-Adapter Pattern
- 交互设计与状态模式,兼谈几个失败的设计
- 设计模式与泡mm的关系之state状态模式及再思考
- 设计模式学习笔记(二十二)——State状态
- 深入浅出Java设计模式之状态模式
- 设计模式初学者系列之状态模式
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- [设计模式] 22.State 状态模式
- 设计模式----State(状态)模式
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
- C#设计模式(10)-Adapter Pattern