设计模式之状态模式
来源:互联网 发布:java 今天星期几 编辑:程序博客网 时间:2024/05/22 08:27
模式定义:
模式结构:
模式实现:
public class StatePattern { @Test public void testState() { Fish fish = new Fish(); fish.hurt(); fish.cure(); fish.cure(); fish.hurt(); fish.hurt(); fish.hurt(); fish.rebirth(); } /** * 小鱼人 */ class Fish { /** * 当前状态,当前血量 */ private IState cur; private int blood; /** * 四种状态 */ private IState death; private IState rebirth; private IState hurt; private IState cure; public Fish() { death = new Death(this); rebirth = new Rebirth(this); hurt = new Hurt(this); cure = new Cure(this); //默认状态为 满血复活状态 cur = rebirth; blood = 100; } public int getBlood() { return blood; } public void setBlood(int blood) { this.blood = blood; } public IState getCur() { return cur; } public void setCur(IState cur) { this.cur = cur; } public IState getCure() { return cure; } public void setCure(IState cure) { this.cure = cure; } public IState getDeath() { return death; } public void setDeath(IState death) { this.death = death; } public IState getHurt() { return hurt; } public void setHurt(IState hurt) { this.hurt = hurt; } public IState getRebirth() { return rebirth; } public void setRebirth(IState rebirth) { this.rebirth = rebirth; } public void hurt() { cur.hurt(); } public void cure() { cur.cure(); } public void rebirth() { cur.rebirth(); } } class Death implements IState { private Fish fish; public Death(Fish fish) { this.fish = fish; } @Override public void rebirth() { fish.setCur(fish.getRebirth()); fish.setBlood(100); System.out.println("you are rebirth, current blood is " + fish.getBlood() + ". \n"); } @Override public void hurt() { System.out.println("you are death, can't be hurt"); } @Override public void cure() { System.out.println("you are death, can't be cured"); } } class Rebirth implements IState { private Fish fish; public Rebirth(Fish fish) { this.fish = fish; } @Override public void rebirth() { System.out.println("you have rebirth, no rebirth again"); } @Override public void hurt() { if (fish.getBlood() > 50) { fish.setCur(fish.getHurt()); fish.setBlood(fish.getBlood() - 50); System.out.println("you have been hurt, current blood is " + fish.getBlood() + ". \n"); } else { fish.setCur(fish.death); fish.setBlood(0); System.out.println("you have been hurt to death, current blood is " + fish.getBlood() + ". \n"); } } @Override public void cure() { System.out.println("you have rebirth, no need cure"); } } class Hurt implements IState { private Fish fish; public Hurt(Fish fish) { this.fish = fish; } @Override public void rebirth() { System.out.println("you are hurt, no rebirth"); } @Override public void hurt() { if (fish.getBlood() > 50) { fish.setCur(fish.getHurt()); fish.setBlood(fish.getBlood() - 50); System.out.println("you have been hurt, current blood is " + fish.getBlood() + ". \n"); } else { fish.setCur(fish.death); fish.setBlood(0); System.out.println("you have been hurt to death, current blood is " + fish.getBlood() + ". \n"); } } @Override public void cure() { fish.setCur(fish.getCure()); fish.setBlood(fish.getBlood() + 50 > 100 ? 100 : fish.getBlood() + 50); System.out.println("you have been cured, current blood is " + fish.getBlood() + ". \n"); } } class Cure implements IState { private Fish fish; public Cure(Fish fish) { this.fish = fish; } @Override public void rebirth() { System.out.println("you are cure, no rebirth"); } @Override public void hurt() { fish.setCur(fish.getHurt()); fish.setBlood(fish.getBlood() - 50); System.out.println("you have been hurt, current blood is " + fish.getBlood() + ". \n"); } @Override public void cure() { fish.setCur(fish.getCure()); fish.setBlood(fish.getBlood() + 50 > 100 ? 100 : fish.getBlood() + 50); System.out.println("you have been cured, current blood is " + fish.getBlood() + ". \n"); } } /** * LOL英雄状态 */ interface IState { /** * 重生 */ void rebirth(); /** * 受伤 */ void hurt(); /** * 治疗 */ void cure(); }}
模式优点:
1、封装了转换规则
2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
4、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
模式缺点:
1、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
2、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码
适用场景:
1、对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为
2、代码中包含大量与对象状态有关的条件语句
阅读全文
0 0
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之--状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 【设计模式】之状态模式
- android通知栏屏蔽访客模式
- (chrome)Adobe Flash 无法正常使用
- ijkPlayer编译流程记录
- python基础之map/reduce/filter/sorted
- opengles中使用vbo(顶点缓冲区)
- 设计模式之状态模式
- awk/sed-Exercise
- (42)触发器Actor
- 数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )
- 单调,凹凸,极最拐,渐近线,曲率以及不等式的证明方法
- linux wc
- 查看mysql 占用空间
- python基础之面向对象02
- Setup OpenCV SDK in Android Studio project