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

状态模式

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

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

主要角色

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

    }
}

执行效果

在这里插入图片描述

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码拉松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值