定义
装饰器模式是指为原始对象添加一些额外的功能,使其变得更加强大。这里就以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%");
}
}
至此,装饰器模式重构完成,用户可以根据自己的需求自由搭配各种装饰器,使原始对象的特性动态地得到增强
以上就是所有内容,我将持续更新设计模式,欢迎大家一起交流😁