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