装饰器模式

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-18 19:20:34

装饰器模式

创建一个装饰类,用来包装原有的类,在保证不改变其结构完整的情况下,提供额外的功能。

介绍

意图:动态的为类增加新的功能。

使用场景:在不想增加许多子类的情况下扩展类。

关键代码

  • Component类充当抽象角色,不应该是具体实现。
  • 修饰类引用和继承Component类,具体扩展类重写父类方法。

优点:装饰类和被装饰类相互独立,不会相互耦合,是继承的一个替代模式,动态的对类的功能进行扩展,更加的灵活。

缺点:多层装饰比较复杂

使用:

// 接口
/**
 * 英雄接口
 * @author 98543
 */
public interface Hero {
    
    public void learnSkill();

}

// 被修饰类
/**
 * 具体英雄
 * @author 98543
 */
public class BlindMonk implements Hero{
    
    protected String name;
    
    public BlindMonk(String name) {
        this.name = name;
    }
    
    @Override
    public void learnSkill() {
        System.out.println(name+"学习了以上技能");
    }

}

// 抽象修饰器
/**
 * 抽象修饰类
 * @author 98543
 */
public abstract class DecoratorComponent implements Hero{
    
    private Hero hero;
    
    public DecoratorComponent(Hero hero) {
        this.hero = hero;
    }
    
    @Override
    public void learnSkill() {
        if (hero != null) 
            hero.learnSkill();
    }

}

// 修饰器
public class LearnSkill_Q extends DecoratorComponent{
    
    private String skillName;
    
    public LearnSkill_Q(Hero hero,String skillName) {
        super(hero);
        this.skillName = skillName;
    }
    
    public void learnSkill() {
        System.out.println("学习了技能->"+skillName);
        super.learnSkill();
    }
}
public class LearnSkill_W extends DecoratorComponent{
    
    private String skillName;
    
    public LearnSkill_W(Hero hero,String skillName) {
        super(hero);
        this.skillName = skillName;
    }
    
    public void learnSkill() {
        System.out.println("学习了技能->"+skillName);
        super.learnSkill();
    }

}
public class LearnSkill_E extends DecoratorComponent{

    private String skillName;
    
    public LearnSkill_E(Hero hero,String skillName) {
        super(hero);
        this.skillName = skillName;
    }
    
    public void learnSkill() {
        System.out.println("学习了技能->"+skillName);
        super.learnSkill();
    }
}
/**
 * 具体修饰类
 * @author 98543
 */
public class LearnSkill_R extends DecoratorComponent{
    
    private String skillName;
    
    public LearnSkill_R(Hero hero,String skillName) {
        super(hero);
        this.skillName = skillName;
    }
    
    public void learnSkill() {
        System.out.println("学习了技能->"+skillName);
        super.learnSkill();
    }

}

// 测试代码
public class DecoratorPatternTest {
    
    public static void main(String[] args) {
        Hero hero = new BlindMonk("李青");
        LearnSkill_R r = new LearnSkill_R(hero, "猛龙摆尾");
        LearnSkill_E e = new LearnSkill_E(r, "天雷破/摧筋断骨");
        LearnSkill_W w = new LearnSkill_W(e, "金钟罩/铁布衫");
        LearnSkill_Q q = new LearnSkill_Q(w, "天音波/回音击");
        q.learnSkill();
    }

}

// 输出
    学习了技能->天音波/回音击
    学习了技能->金钟罩/铁布衫
    学习了技能->天雷破/摧筋断骨
    学习了技能->猛龙摆尾
    李青学习了以上技能
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!