设计模式-10 状态模式
来源:互联网 发布:纳什均衡和福利最优化 编辑:程序博客网 时间:2024/05/21 17:35
状态模式介绍
状态模式就是在不同的状态下的同一种行为会有不同的结果。他和策略模式的类结构几乎一样。但是却和策略模式有着本质的不同。比如以打铁为例:在状态模式下:那么同样是打铁,当铁的温度在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 { /** * 打开电视 */ 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的判断。对于状态更多的比如三种四种,效果更明显。
0 0
- 设计模式--[10]状态模式
- 设计模式-10 状态模式
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 设计模式-状态模式
- [设计模式]状态模式
- 设计模式 状态模式
- Spring @Value 用法小结,#与$的区别
- 在Launcher3添加新的ListView,把应用添加到list中
- linux 环境下的mysql操作
- C++中堆和栈的完全解析
- window下pip 用不了的一种解决办法
- 设计模式-10 状态模式
- PHP 相关配置文件
- 如何ping同一个网段内的所有在用IP
- 深入剖析jsonp跨域原理
- ORACLE数据库汉字占几个字节问题
- 【转】Mysql 约束(Constraint)
- 从零开始
- Java单链表实现
- Linux 常用命令个人记录