状态模式
状态模式属于行为性模式,我们通常会创建各种状态的对象和一个行为对象,行为对象会随着状态对象的改变而改变。
意图:允许一个对象在其内部状态改变时改变它的行为。
主要解决:对选哪个的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
何时使用:代码中包含大量与对象状态有关的条件语句。
主要角色
状态(State)
接口类,定义了状态对象的各种行为。
具体状态
实现了状态接口的具体状态类,定义了每个不同的状态下,产生的不同的行为。
状态环境(Context)
状态环境类中包含了具体的状态对象,提供状态改变、执行状态类定义的方法。
案例演示
在某些游戏中,会给某一个角色附加一种可以增强自身能力的“效果”,通常叫做buff,不同的buff会给角色带来不同的行为,针对这样的场景看看我们如何用状态模式来实现。
状态(State)
public interface Buff {
/**
* 获得攻击buff
*
* @param context
*/
void obtainAttackBuff(Context context);
/**
* 获得防御buff
*
* @param context
*/
void obtainDefBuff(Context context);
/**
* 攻击
*/
void attack();
/**
* 防御
*/
void def();
}
具体状态
public class NoBuff implements Buff {
@Override
public void attack() {
System.out.println("普通攻击");
}
@Override
public void def() {
System.out.println("普通防御");
}
@Override
public void obtainAttackBuff(Context context) {
System.out.println("获得攻击BUFF");
context.setBuff(new AttackBuff());
}
@Override
public void obtainDefBuff(Context context) {
System.out.println("获得防御BUFF");
context.setBuff(new DefBuff());
}
}
public class AttackBuff implements Buff {
@Override
public String toString() {
return "攻击加强BUFF";
}
@Override
public void obtainAttackBuff(Context context) {
System.out.println("已经有攻击BUFF");
}
@Override
public void obtainDefBuff(Context context) {
System.out.println("获得防御BUFF");
context.setBuff(new DefBuff());
}
@Override
public void attack() {
System.out.println("攻击加强");
}
@Override
public void def() {
System.out.println("普通防御");
}
}
public class DefBuff implements Buff {
@Override
public void obtainAttackBuff(Context context) {
System.out.println("获得攻击BUFF");
context.setBuff(new AttackBuff());
}
@Override
public void obtainDefBuff(Context context) {
System.out.println("已经有防御BUFF");
}
@Override
public void attack() {
System.out.println("普通攻击");
}
@Override
public void def() {
System.out.println("防御加强");
}
@Override
public String toString() {
return "防御加强BUFF";
}
}
状态环境(Context)
public class Context {
private Buff buff;
public Buff getBuff() {
return buff;
}
public void setBuff(Buff buff) {
this.buff = buff;
}
public void attack() {
this.buff.attack();
}
public void def() {
this.buff.def();
}
public void obtainAttackBuff() {
this.buff.obtainAttackBuff(this);
}
public void obtainDefBuff() {
this.buff.obtainDefBuff(this);
}
}
public class Main {
public static void main(String[] args) {
Context context = new Context();
context.setBuff(new NoBuff());
context.attack();
context.def();
System.out.println("------------------------");
context.obtainAttackBuff();
System.out.println("------------------------");
context.attack();
context.def();
System.out.println("------------------------");
context.obtainDefBuff();
System.out.println("------------------------");
context.attack();
context.def();
}
}
执行效果
总结
状态模式最大特点就是状态的改变是在状态的内部发生的,在某种状态下产生的行为引起了状态的改变,就好像事物的行为会自己发现变化一样。