動態添加對象功能(通過疊加功能組件),可以有效分離性能組件和功能組件,提升模塊的可維護性和複用性
具體組件(被裝飾者),具體的業務邏輯
裝飾者,持有一個具體的被裝飾者對象
具體裝飾者,實現裝飾邏輯,繼承自裝飾者
具體組件
裝飾者
具體裝飾者1
具體裝飾者2
主函數
主要角色:
組件接口,裝飾者和被裝飾者的接口,定義了被裝飾者的核心功能和裝飾者需要加強的功能點具體組件(被裝飾者),具體的業務邏輯
裝飾者,持有一個具體的被裝飾者對象
具體裝飾者,實現裝飾邏輯,繼承自裝飾者
UML圖見書P28
例子:
組件接口public interface IPacketCreator{
public String handle();
}
具體組件
public class PBCreator implements IPacketCreator{
@Override
public String handle(){
return "hello world";
}
}
裝飾者
public abstract class PDecorator implements IPacketCreator{
IPacketCreator component;
public PDecorator(IPacketCreator c){
this.component =c;
}
}
具體裝飾者1
public class PHCreator extends PDecorator{
public PHCreator(IPacketCreator c){
super(c);
}
@Override
public String handle(){
StringBuilder sb = new StringBuilder();
sb.append("HHHHH");
sb.append(component.handle());
sb.append("HHHHH");
return sb.toString();
}
}
具體裝飾者2
public class PHCreator2 extends PDecorator{
public PHCreator2(IPacketCreator c){
super(c);
}
@Override
public String handle(){
StringBuilder sb = new StringBuilder();
sb.append("22222222");
sb.append(component.handle());
sb.append("22222222");
return sb.toString();
}
}
主函數
public class Main{
public static void main(String[] args){
IPacketCreator ipc = new PHCreator2(new PHCreator(new PBCreator()));
System.out.println(ipc.handle());
}
}