装饰模式和外观模式
1、裝飾模式(Decorator)
當我們擴展一個類時,通常使用繼承子類的方式,但當擴展的功能比較多的時候,子類會變得比較臃腫,在這種情況下,除了使用delegation以外,還可以使用裝飾模式。裝飾模式形象地理解就是往類上套上包裝進行裝飾,也就是說在不改變類結構的前提下,向現有的對象提供新的功能,因此這是一種結構性模式。
- 裝飾模式的應用場景:當需要給一個現有類添加附加職責,但該類被隱藏或者該類是終極類或者采用繼承方式會產生大量的子類;當對象的功能要求可以動態地添加,也可以再動態地撤銷時;
- Java中裝飾模式的應用;InputStream 的子類 FilterInputStream、Reader 的子類 BufferedReader 以及FilterReader等都是抽象裝飾模式。
- 裝飾模式的框架:
抽象模式實例
以雞蛋餅為例,在初始版本上,可以增加香腸、生菜、里脊等多種食材,而這一些食材就可以視作裝飾,雞蛋餅就是被裝飾的對象。
首先創建被裝飾對象接口和其初始版本。
接下來創建裝飾器基類和具體的裝飾器;
public abstract class Decorator implements Omelette{//裝飾器基類protected Omelette input;public Decorator(Omelette input){this.input=input;}public abstract void addIngredients();//在具體裝飾器實現 }public class sausageDecorator extends Decorator{//裝飾香腸public sausageDecortor(Omelette input){super(input);}@Overridepublic void addIngredients(){input.addIngredients();System.out.println("The Omelette is decorated with sausage");} }public class lettuceDecorator extends Decorator{//裝飾生菜,和香腸裝飾類相似... } ...在Client端調用
public class Client{public static void main(String[] args){Omelette one=new originOmelette();//初始未裝飾類Omelette two=new sausageDecorator(a);Omelette three=new lettuceDecorator(b);three.addIngredients();} }- 裝飾模式的優點:采用裝飾模式擴展對象的功能比采用繼承方式擴展性和靈活性更好;可以設計出多個不同的具體裝飾類,創造出多個不同行為的組合,而對于采用繼承方式來說,多種組合會出現組合爆炸的情況。
- 裝飾模式的缺點:裝飾層數比較多時,會增加較多子類。
2、外觀模式(Facade)
外觀模式為客戶端提供一個窗口來訪問子系統,這個窗口實際上就是一個更高層的接口,也可以視之為系統的入口。當客戶端不需要知道子系統內部各部分之間的復雜關系時,可以使用外觀模式。
- 外觀模式的應用場景:當一個復雜系統的子系統很多時,使用外觀模式為系統設計一個簡單的接口供客戶端訪問;當客戶端與多個子系統之間存在很大聯系時,引入外觀模式可以將它們分離。
- 外觀模式的結構:
- 外觀模式的代碼框架;
首先給出子系統類
public class featuresOne{//三個子系統類和對應的實現方法public void method1(){...}... } public class featuresTwo{public void method2(){...}... } public class featuresThree{public void method3(){...}... }給出外觀類
public class Facade{private featuresOne feature1=new FeaturesOne();private featuresTwo feature2=new FeaturesTwo();private featuresThree feature3=new FeaturesThree();public void Method1(){feature1.method1();}public void Method2(){feature1.method2();}public void Method3(){feature1.method3();} }Client端調用
public class Client{public static void main(String[] args){Facade facade=new Facade();facade.Method1();facade.Method2();facade.Method3();}- 外觀模式的優點:降低子系統和客戶端之間的耦合度,使子系統變化不會影響調用它的客戶端;減少客戶端處理對象的數目;
- 外觀模式的缺點:增加新的子系統需要修改外觀類和客戶端,修改子系統重寫和繼承都不太方便;
- 外觀模式的改進:對于外觀模式的缺點,可以引入抽象外觀類,對于不同的具體外觀類來說可以對子系統進行組合。
總結
- 上一篇: 行人检测-Pedestrian Dete
- 下一篇: 二值图像处理 腐蚀