裝飾器模式適用于為一個對象額外動態(tài)的添加功能,每一個具體的裝飾類都是一個功能。
類圖如下
1.ConcretConponent是需要被裝飾的類摔敛,ConcretDecorator是裝飾類,他們有一個共同的父類Component廷支。
2.ConcretDecorator中有ConcretConponent類的引用。
3.ConcretDecorator中的operation()中執(zhí)行ConcretConponent的operation()并添加新的功能栓辜。
舉個例子恋拍,一個游戲人物可以學(xué)習(xí)技能,這個游戲任務(wù)就是ConcretConponent啃憎,技能就是ConcretDecorator。
首先定義這個游戲的角色 Role
public interface Role {
void learnSkill();
}
定義需要具體被裝飾的角色
public class Warlock implements Role {
public void learnSkill() {
System.out.println("術(shù)士學(xué)習(xí)了以下幾個技能");
}
}
定義ConcretDecorator
public class Skill implements Role {
private Role role;
public void learnSkill() {
if (role != null) {
role.learnSkill();
}
}
public Skill(Role role) {
this.role = role;
}
}
定義三個具體的技能A B C
public class Skill_A extends Skill {
public Skill_A(Role role) {
super(role);
}
@Override
public void learnSkill(){
super.learnSkill();
System.out.println("學(xué)習(xí)了技能 A");
}
}
public class Skill_B extends Skill{
public Skill_B(Role role) {
super(role);
}
@Override
public void learnSkill(){
super.learnSkill();
System.out.println("學(xué)習(xí)了技能 B");
}
}
public class Skill_C extends Skill{
public Skill_C(Role role) {
super(role);
}
@Override
public void learnSkill() {
super.learnSkill();
System.out.println("學(xué)習(xí)了技能 C");
}
}
編寫測試
Role r = new Warlock();
Skill a = new Skill_A(r);
Skill b = new Skill_B(a);
b.learnSkill();
結(jié)果
術(shù)士學(xué)習(xí)了以下幾個技能
學(xué)習(xí)了技能 A
學(xué)習(xí)了技能 B