java 23种设计模式之行为型模式—状态模式(20)
状态模式他允许对象在内部状态改变的时候,改变它的行为。
状态模式一般有四个角色
A、抽象状态角色(State)
B、具体的状态角色(State1)
C、具体状态(StateContext)
D:客户端
我这里就以游戏里的角色杀怪为例
本例模拟一个游戏角色
满血到60%血状态,高级工具杀怪
60%到20%血状态,普通工具杀怪
20%到2%血状态,只能逃命了
2%到0%血状态,要死了,哈哈。
本例,角色一共有6个状态
假定,被怪物杀一下,减掉1%的血量,吃一个包子恢复5%的血量
第一:抽象的状态角色
public interface State { public void operation(StateContext stateContext); }第二:具体的状态角色
public class State1 implements State{ @Override public void operation(StateContext stateContext) { // TODO Auto-generated method stub String str = stateContext.getOperation().equals("eat")?"吃了 "+stateContext.getCount()+" 个包子.":"被攻击了 "+stateContext.getCount()+" 次."; System.out.println(str +" 当前血量:"+stateContext.getBlood()+" ,可以高级工具杀怪"); } } public class State2 implements State{ @Override public void operation(StateContext stateContext) { String str = stateContext.getOperation().equals("eat")?"吃了 "+stateContext.getCount()+" 个包子.":"被攻击了 "+stateContext.getCount()+" 次."; System.out.println(str +" 当前血量:"+stateContext.getBlood()+" ,可以普通工具杀怪"); } } public class State3 implements State{ @Override public void operation(StateContext stateContext) { String str = stateContext.getOperation().equals("eat")?"吃了 "+stateContext.getCount()+" 个包子.":"被攻击了 "+stateContext.getCount()+" 次."; System.out.println(str +" 当前血量:"+stateContext.getBlood()+" ,只能逃命了"); } } public class State4 implements State{ @Override public void operation(StateContext stateContext) { String str = stateContext.getOperation().equals("eat")?"吃了 "+stateContext.getCount()+" 个包子.":"被攻击了 "+stateContext.getCount()+" 次."; System.out.println(str +" 当前血量:"+stateContext.getBlood()+" ,要死了,哈哈"); } }每个具体的状态角色都有自己的方法,我这里都是一样的方法。
第三:具体状态
public class StateContext { //需要管理的那个状态 private State state = null; public String getOperation() { return operation; } public int getCount() { return count; } private String operation; private int count; private double blood = 1.0; private void setBlood(double blood){ this.blood = (this.blood +blood>1.0?1.0:(this.blood +blood<0?0:this.blood +blood)); } public double getBlood(){ return this.blood; } public void Context(String operation,int count){ this.operation = operation; this.count = count; if(operation.equals("attack")){ setBlood(-count*0.01); } if(operation.equals("eat")){ setBlood(count*0.05); } stateManager(this.blood); } @SuppressWarnings("unused") private void stateManager(double blood){ if(blood>=0.6){ state = new State1(); }else if(blood>=0.2 && blood<0.6){ state = new State2(); }else if(blood>0.02 && blood<0.2){ state = new State3(); }else{ state = new State4(); } state.operation(this); } }第四:客户端
public class Clent { public static void main(String[] args) { StateContext sc = new StateContext(); sc.Context("attack", 50); sc.Context("attack", 40); sc.Context("eat", 10); } }运行结果如下:
被攻击了 50 次. 当前血量:0.5 ,可以普通工具杀怪
被攻击了 40 次. 当前血量:0.09999999999999998 ,只能逃命了
吃了 10 个包子. 当前血量:0.6 ,可以高级工具杀怪
请参考位前面写的策略模式
个人理解
策略模式和状态模式的不同点:
策略模式是多种算法,由用户选择,他无法在程序内部切换
状态模式也可以认为有多种算法,只是他是有状态决定了用哪一种,他是可以在程序切换的,
适用场景:
1、一个对象的行为取决于他的状态的该表,并且它必须在运行时根据状态改变它的行为;
2、一个操作中有很多分支结构,这些分支决定于对象的状态的变化。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情