装饰器模式
可以理解为在不改变原有程序的前提下,向一个现有的对象添加新的修饰(功能)。
例如:原有程序实现的功能为“李青学习技能”,这时新的业务要求显示学习的具体技能,那么“学习什么技能”就是一个新的修饰。
具体实现
首先,创建一个接口 HeroAction
package DecoratorPattern;
public interface HeroAction {
public void learnSkill();
}
然后,定义 Hero 实体类实现 HeroAction 接口
package DecoratorPattern;
public class Hero implements HeroAction{
private String heroName;
public Hero(String heroName) {
this.heroName = heroName;
}
@Override
public void learnSkill() {
System.out.print("[" + heroName + "] 学习了技能");
}
}
------ 到这里实现了原有功能“李青学习技能” ------
------ 下面开始对原有功能做修饰 ------
接着,定义抽象装饰类 SkillsDecorator 实现 HeroAction 接口(持有 HeroAction 接口对象)
package DecoratorPattern;
public abstract class SkillsDecorator implements HeroAction {
private HeroAction heroAction;
public SkillsDecorator(HeroAction heroAction) {
this.heroAction = heroAction;
}
@Override
public void learnSkill() {
if (heroAction != null)
heroAction.learnSkill();
}
}
最后,实现该装饰类来修饰 HeroAction 对象(即学习了什么技能)
package DecoratorPattern;
public class SkillsDecoratorImpl extends SkillsDecorator {
private String skillName;
public SkillsDecoratorImpl(HeroAction heroAction, String skillName) {
super(heroAction);
this.skillName = skillName;
}
@Override
public void learnSkill() {
super.learnSkill();
System.out.print(" [" + skillName + "]\n");
}
}
测试
package DecoratorPattern;
public class main {
public static void main(String[] args) {
HeroAction hero = new Hero("李青");
SkillsDecorator sd = new SkillsDecoratorImpl(hero, "Q: 天音波/回音击");
sd.learnSkill();
}
}
测试结果: