裝飾器模式
可以理解為在不改變?cè)谐绦虻那疤嵯拢蛞粋€(gè)現(xiàn)有的對(duì)象添加新的修飾(功能)。
例如:原有程序?qū)崿F(xiàn)的功能為“李青學(xué)習(xí)技能”,這時(shí)新的業(yè)務(wù)要求顯示學(xué)習(xí)的具體技能,那么“學(xué)習(xí)什么技能”就是一個(gè)新的修飾。
具體實(shí)現(xiàn)
首先,創(chuàng)建一個(gè)接口 HeroAction
package DecoratorPattern;
public interface HeroAction {
public void learnSkill();
}
然后,定義 Hero 實(shí)體類(lèi)實(shí)現(xiàn) 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 + "] 學(xué)習(xí)了技能");
}
}
------ 到這里實(shí)現(xiàn)了原有功能“李青學(xué)習(xí)技能” ------
------ 下面開(kāi)始對(duì)原有功能做修飾 ------
接著,定義抽象裝飾類(lèi) SkillsDecorator 實(shí)現(xiàn) HeroAction 接口(持有 HeroAction 接口對(duì)象)
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();
}
}
最后,實(shí)現(xiàn)該裝飾類(lèi)來(lái)修飾 HeroAction 對(duì)象(即學(xué)習(xí)了什么技能)
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");
}
}
測(cè)試
package DecoratorPattern;
public class main {
public static void main(String[] args) {
HeroAction hero = new Hero("李青");
SkillsDecorator sd = new SkillsDecoratorImpl(hero, "Q: 天音波/回音擊");
sd.learnSkill();
}
}
測(cè)試結(jié)果:

運(yùn)行結(jié)果.png