java 23种设计模式之行为型模式—状态模式(20)

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 ,可以高级工具杀怪

请参考位前面写的策略模式

JAVA 23种设计模式之行为型模式—策略模式(13)

个人理解

策略模式和状态模式的不同点:

策略模式是多种算法,由用户选择,他无法在程序内部切换

状态模式也可以认为有多种算法,只是他是有状态决定了用哪一种,他是可以在程序切换的,



适用场景:
1、一个对象的行为取决于他的状态的该表,并且它必须在运行时根据状态改变它的行为;

2、一个操作中有很多分支结构,这些分支决定于对象的状态的变化。





爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img