裝飾者模式--Decorator
阿新 • • 發佈:2018-12-16
1: 作用
動態的給物件增加執行的業務,不受數量限制。可以代替子類,同時避免子類與父類的高耦合。增加靈活性。
2:構成
2.1 裝飾者抽象類--Decorator (可以是介面)
最終生成一個指向被裝飾物件基類(Component)例項的引用,並定義一個與被裝飾物件基類(Component)介面一致的介面。
通過這個抽象類或介面來指向具體的執行物件。
2.2 被裝飾的物件的基類--Component
放在最裡面核心的位置,用來生成基礎的被裝飾物件,可以給這個物件動態的新增職責。
2.3具體被裝飾物件--ConcreteComponent
生成具體的裝飾物件,其屬性中包含一個裝飾者抽象類Decorator物件,一般擁有一個含參的構造方法,引數為一個裝飾者抽象類Decorator物件,用來設定屬性中的裝飾者抽象類Decorator物件。
2.4 具體的裝飾者 - ConcreteDecorator
最終的操作者,給內部的被裝飾的物件增加(裝飾物件的)職責。
3 例
目的:造一座房子 ; 裝飾:門,窗,床。
可以任意的給這座房子裝飾 門,窗,床中的一種或幾種。順序也可以改變。
//裝飾者抽象類 public interface Build { public void act(); } //具體裝飾 public class BuildBed implements Build { Build bud; public BuildBed(Build bu){ this.bud = bu; } @Override public void act() { // TODO Auto-generated method stub System.out.println("造一架床"); this.bud.act(); } } //具體裝飾 public class BuildDoor implements Build { Build bud; public BuildDoor(Build bu){ this.bud = bu; } @Override public void act() { // TODO Auto-generated method stu System.out.println("修一個門"); this.bud.act(); } } //具體裝飾 public class BuildWindow implements Build { Build bud; public BuildWindow(Build bu){ this.bud = bu; } @Override public void act() { // TODO Auto-generated method stub System.out.println("修一個窗"); this.bud.act(); } } //具體被裝飾物件 public class House implements Build { @Override public void act() { System.out.println("造一座房子"); } } public class test { public static void main(String[] args) { // TODO Auto-generated method stub //修一個門;修一個窗;造一座房 Build bud1 = new BuildDoor(new BuildWindow(new House())); bud1.act(); //造一架床;修一個窗;修一個門,造一座房 Build bud2 = new BuildBed( new BuildWindow(new BuildDoor( new House()))); bud2.act(); } }
具體裝飾之上可以抽象出一層裝飾者抽象類。