【设计模式实践系列】状态模式

状态模式

状态模式属于行为性模式,我们通常会创建各种状态的对象和一个行为对象,行为对象会随着状态对象的改变而改变。

意图:允许一个对象在其内部状态改变时改变它的行为。
主要解决:对选哪个的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
何时使用:代码中包含大量与对象状态有关的条件语句。

主要角色

状态(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();

    }
}

执行效果

在这里插入图片描述

总结

状态模式最大特点就是状态的改变是在状态的内部发生的,在某种状态下产生的行为引起了状态的改变,就好像事物的行为会自己发现变化一样。

おすすめ

転載: blog.csdn.net/CSDN_WYL2016/article/details/120801918