装饰器模式
创建一个装饰类,用来包装原有的类,在保证不改变其结构完整的情况下,提供额外的功能。
介绍
意图:动态的为类增加新的功能。
使用场景:在不想增加许多子类的情况下扩展类。
关键代码:
- 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(); } } // 输出 学习了技能->天音波/回音击 学习了技能->金钟罩/铁布衫 学习了技能->天雷破/摧筋断骨 学习了技能->猛龙摆尾 李青学习了以上技能
来源:https://www.cnblogs.com/kungFuPander/p/11468364.html