设计模式_12:状态模式
来源:互联网 发布:java给qq邮箱发邮件 编辑:程序博客网 时间:2024/06/05 19:40
创建一个Hero类,有一个方法work可以根据当前实例的体力(power)和是否过于疲倦(isTired)来做出不同的反应:
public class Main { public static void main(String[] args) { Hero hero = new Hero(100, false); hero.work(); hero.setPower(75); hero.work(); hero.setPower(50); hero.work(); hero.setPower(25); hero.work(); hero.setPower(0); hero.work(); hero.setTired(true); hero.work(); }}class Hero { private int power; private boolean isTired; public Hero(int power, boolean isTired) { this.power = power; this.isTired = isTired; } public void work() { if (power > 75){ System.out.println("power:" +power+ " 精力充沛地干活"); } else if (power > 50){ System.out.println("power:" +power+ " 不慌不忙地干活"); } else if (power > 25){ System.out.println("power:" +power+ " 疲惫不堪地干活"); } else { if (!isTired){ if (power > 0){ System.out.println("power:" +power+ " 极度疲劳地干活"); } else { System.out.println("power:" +power+ " 体力透支,晕倒了"); } } else { System.out.println("power:" +power+ " 太累,不干了"); } } } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public boolean isTired() { return isTired; } public void setTired(boolean tired) { isTired = tired; }}运行结果:
power:100 精力充沛地干活power:75 不慌不忙地干活power:50 疲惫不堪地干活power:25 极度疲劳地干活power:0 体力透支,晕倒了power:0 太累,不干了
可以看到代码中有较多的if-else判断,意味着这个方法的责任过大,如果改动或添加分支,都需要在这个方法上改,维护出错的风险增大,违背了单一职责原则、开闭原则。
我们可以用状态模式来改良这个设计:
public class Main { public static void main(String[] args) { Hero hero = new Hero(100, false); hero.work(); hero.setPower(75); hero.work(); hero.setPower(50); hero.work(); hero.setPower(25); hero.work(); hero.setPower(0); hero.work(); hero.setTired(true); hero.work(); }}//抽象状态接口interface IState { void work(Hero hero);}class HappyWork implements IState{ @Override public void work(Hero hero) { if (hero.getPower() > 75){ System.out.println("power:" +hero.getPower()+ " 精力充沛地干活"); } else { hero.setCurState(new NormalWork()); hero.work(); } }}class NormalWork implements IState{ @Override public void work(Hero hero) { if (hero.getPower() > 50){ System.out.println("power:" +hero.getPower()+ " 不慌不忙地干活"); } else { hero.setCurState(new TiredWork()); hero.work(); } }}class TiredWork implements IState{ @Override public void work(Hero hero) { if (hero.getPower() > 25){ System.out.println("power:" +hero.getPower()+ " 疲惫不堪地干活"); } else { hero.setCurState(new VeryTiredWork()); hero.work(); } }}class VeryTiredWork implements IState{ @Override public void work(Hero hero) { if (!hero.isTired()){ if (hero.getPower() > 0){ System.out.println("power:" +hero.getPower()+ " 极度疲劳地干活"); } else { hero.setCurState(new SleepWork()); hero.work(); } } else { hero.setCurState(new NoPowerWork()); hero.work(); } }}class SleepWork implements IState{ @Override public void work(Hero hero) { if (hero.isTired()) { hero.setCurState(new NoPowerWork()); hero.work(); } else { System.out.println("power:" +hero.getPower()+ " 体力透支,晕倒了"); } }}class NoPowerWork implements IState{ @Override public void work(Hero hero) { System.out.println("power:" +hero.getPower()+ " 太累,不干了"); }}class Hero { //这里增加一个当前状态的引用 private IState curState; private int power; private boolean isTired; public Hero(int power, boolean isTired) { this.power = power; this.isTired = isTired; this.curState = new HappyWork(); } public void work() { this.curState.work(this); } public int getPower() { return power; } public void setPower(int power) { this.power = power; } public boolean isTired() { return isTired; } public void setTired(boolean tired) { isTired = tired; } public IState getCurState() { return curState; } public void setCurState(IState curState) { this.curState = curState; }}运行结果:
power:100 精力充沛地干活power:75 不慌不忙地干活power:50 疲惫不堪地干活power:25 极度疲劳地干活power:0 体力透支,晕倒了power:0 太累,不干了
阅读全文
1 0
- 设计模式_12:状态模式
- 外观模式(设计模式_12)
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 设计模式-状态模式
- [设计模式]状态模式
- 设计模式 状态模式
- 【云栖大会】阿里云联合中科院量子创新研究院发布量子计算云平台
- Oracle的关于建表,约束,查询等的练习
- 机器学习技法课程学习笔记16 -- Finale
- Android studio导入项目后无法运行并且所有文件都处于禁止状态
- CSliderCtrl自绘开发
- 设计模式_12:状态模式
- jquery插件封装指南
- python_pandas_dataframe_行列选择_切片操作
- Oracle 树操作、递归查询(select…start with…connect by…prior)
- VMware-workstation官方直接下载地址
- 了解Linux的目录结构
- 【云栖大会】阿里成立达摩院,学习别人的经验走自己的路解决未来问题
- 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换
- SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别