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/天,具体规则查看活动详情