设计模式之装饰器模式

定义

装饰器模式是指为原始对象添加一些额外的功能,使其变得更加强大。这里就以LOL游戏来举例吧,玩过此游戏的老铁应该知道,游戏中有很多件装备,可以帮助我们的英雄提升攻击力、法术强度、物理抗性、魔法抗性等。其实为英雄买装备,就和我们的装饰器模式的原理是一样的。

代码实现

1.Hero接口

public interface Hero {
    void attack();
}

2.实现类MissFortune

public class MissFortune implements Hero {
    @Override
    public void attack() {
        System.out.println("初始攻击");
    }
}

3.装饰器类Decorator

public class Decorator implements Hero {

    private Hero hero;

    public Decorator(Hero hero) {
        this.hero = hero;
    }

    @Override
    public void attack() {
        hero.attack();
        System.out.println("装备无尽之刃,攻击力加50,暴击率增加25%");
    }
}

4.Client

public class Client {
    public static void main(String[] args) {
        new Decorator(new MissFortune()).attack();
    }
}

到此,我们为英雄装备了一件无尽之刃,但是游戏中,有很多件装备,我们应该怎么让装饰器能够为英雄装备所有的装备呢?我们肯定不能将这些操作统统写到该装饰器类里。装备的多样性决定了装饰器应该是多态化的,单个装饰器应该只负责自己的装备特效,把装备按功能分类才能让用户灵活的自由搭配,而不是把所有功能都固化在一个装饰器里。

Hero接口是满足多态化需求的,但是在我们Decorator中存在对被装饰者的引用,我们不能让每件装备都来引用这个被装饰者。因此我们需要将装饰者类抽象化。

5.装饰器抽象类

public class AbstractDecorator implements Hero {

    private Hero hero;

    public AbstractDecorator(Hero hero) {
        this.hero = hero;
    }

    @Override
    public void attack() {
        hero.attack();
    }
}

6.StormSword类

public class StormSword extends AbstractDecorator {
    public StormSword(Hero hero) {
        super(hero);
    }

    @Override
    public void attack() {
        super.attack();
        System.out.println("装备暴风大剑,攻击力+50");
    }
}

StormSword不用去实现Hero接口,而是继承装饰器抽象类,如此父类中的被装饰者对象得以继承,这是继承的优势所在。

7.InfinityBlade 类

public class InfinityBlade extends AbstractDecorator {
    public InfinityBlade(Hero hero) {
        super(hero);
    }

    @Override
    public void attack() {
        super.attack();
        System.out.println("装备无尽之刃,攻击力+50,暴击率+25%");
    }
}

至此,装饰器模式重构完成,用户可以根据自己的需求自由搭配各种装饰器,使原始对象的特性动态地得到增强

以上就是所有内容,我将持续更新设计模式,欢迎大家一起交流😁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值