【设计模式】用英雄联盟来解释装饰者模式

定义 Decorator(装饰者)
侧重于为一个基础对象动态地增强它的职责或能力。
这是面对排列组合所造成的子类数爆炸问题的一种灵活的解决方案。

大家好,我是uzi,擅长被4保一,今天我玩的是瘟疫之源。
在这里插入图片描述

主要靠平a输出。为了面向对象思想及方便管理攻击力及特效,我把它拉出一个接口。

public interface NormalAttack{
    void makeADAttack();
}

没有装备,buff的平a属实是刮痧,但是这些加成对于原平a也只是叠加上去的加成,一层套一层,一层套一层。这就很适合装饰者模式,就像平a,加上了减速效果,又加上了灼烧效果,又加上了中毒效果,互不影响。把这些buff的加成统一管理,新建一个抽象类。但由于这些buff加成只能影响平a,所以仍然需要继承平a的接口。

public abstract class NormalAttackDecorator implements NormalAttack{
   
    NormalAttack normalAttack;
   
    protected NormalAttackDecorator(NormalAttack normalAttack){
        this.normalAttack = normalAttack;
    }

    public abstract void makeADAttack();
}

然后就是具体实现啦。

public class RatNormalAttack implements NormalAttack {

    private int adAttack;

    RatNormalAttack (int adAttack){
        this.adAttack = adAttack;
    }

    public void makeADAttack(){
        System.out.println("初始攻击力为 "+this.adAttack);
    };
}

这是没有一点buff,基础到甚至没有被动的平a,也带不了中毒效果。那就加上去。
在这里插入图片描述

class PoisonNormalAttackDecorator extends NormalAttackDecorator{

    String slowSpecialEfficacy = "中毒";

    protected PoisonNormalAttackDecorator(NormalAttack normalAttack) {
        super(normalAttack);
    }

    @Override
    public void makeADAttack() {
        this.normalAttack.makeADAttack();
        System.out.println("增加了"+slowSpecialEfficacy+"buff");
    }

}

调用办法很简单。在main函数里套娃就可以了。

class Main{
    public static void main(String[] args) {
        NormalAttack ratNormalAttack = new PoisonNormalAttackDecorator(new RatNormalAttack(120));
        ratNormalAttack.makeADAttack();
    }
}

结果:
在这里插入图片描述

接下来就很简单了,可以随意增加,添加buff。
我打完了大龙,又增加了攻击力。

class DragonDecorator extends NormalAttackDecorator{

    NormalAttack normalAttack;
    int addNormalAttack = 40;
    String addNormalAttackType = "男爵";

    protected DragonDecorator(NormalAttack normalAttack) {
        super(normalAttack);
        this.normalAttack = normalAttack;
    }

    public void makeADAttack(){
        this.normalAttack.makeADAttack();
        System.out.println("增加了"+addNormalAttackType+"buff,攻击力提升了"+addNormalAttack);
    }
}

main也相应改成

class Main{
    public static void main(String[] args) {
        NormalAttack ratNormalAttack = new DragonDecorator(new PoisonNormalAttackDecorator(new RatNormalAttack(120)));
        ratNormalAttack.makeADAttack();
    }
}

在这里插入图片描述

又加上了减速buff(代码就略了,和上面差不多)在这里插入图片描述

装饰者模式主要的好处就是,可以自由组合,只需要把外面的套娃设计成你获得的buff即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值