装饰器模式

装饰器模式

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

介绍

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

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

关键代码

  • 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();
	}

}

// 输出
    学习了技能->天音波/回音击
    学习了技能->金钟罩/铁布衫
    学习了技能->天雷破/摧筋断骨
    学习了技能->猛龙摆尾
    李青学习了以上技能
posted @ 2019-09-05 17:15  kungFuPander  阅读(455)  评论(0编辑  收藏  举报