一、定義
動態添加對象功能。通過委託機制,複用系統中的各個組件,在運行時,可以講這些功能組件進行疊加,從而組成一個“超級對象”。
二、設計思想
代碼複用應該儘可能使用組合(委託),而不是使用繼承。因爲繼承是一種緊密耦合,任何父類的改動都會影響到子類,不利於系統維護。裝飾者模式可以有效的分離性能組件和功能組件,從而有效提升模塊的可維護性和複用性。
三、四個角色
(1)組件接口
(2)具體組件
(3)裝飾者
(4)具體裝飾者
四、代碼實現
public interface IBuilding {
public String getDetails();
}
Building.javapublic class Building implements IBuilding{
public String getDetails() {
// TODO Auto-generated method stub
return "一間普通的房子";
}
}
BuildingDecorator.java 裝飾者的抽象類,持有一個被裝飾對象public abstract class BuildingDecorator implements IBuilding{
IBuilding building;
public BuildingDecorator(IBuilding building) {
this.building=building;
}
}
LightingDecorator.java 燈飾裝飾public class LightingDecorator extends BuildingDecorator {
public LightingDecorator(IBuilding building) {
super(building);
}
public String getDetails() {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
sb.append(building.getDetails());
sb.append(",裝上燈飾");
return sb.toString();
}
}
FlowerDecorator.java 鮮花裝飾public class FlowerDecorator extends BuildingDecorator {
public FlowerDecorator(IBuilding building) {
super(building);
}
public String getDetails() {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
sb.append(building.getDetails());
sb.append(",放上幾盆花");
return sb.toString();
}
}
LearnDecorator.java
public class LearnDecorator {
public static void main(String[] args) {
//通過層層構造,將裝飾者添加到被裝飾對象上,可以有選擇性的添加裝飾者
IBuilding building=new LightingDecorator(new FlowerDecorator(new Building()));
System.out.println(building.getDetails());
}
}
運行結果:一間普通的房子,放上幾盆花,裝上燈飾
五、裝飾者模式的具體應用場景
DataOutputStream outputStream=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("f:/example.txt")));
outputStream.writeChars("hello world");