10 淺談 裝飾器模式的理解與使用

在不改變現有類結構的狀況下,爲這個類添加一個新的功能,這就是裝飾器模式ide

所屬與結構型模式,測試

這種模式的特色是:須要建立一個裝飾類來包裝原有的類,而且提供額外的功能。this

 

爲了解決:平時使用繼承的方式,會帶入許多靜態的方法,致使子類過分飽和,膨脹。spa

舉例子:悟空擁有七十二變,無論它怎麼變化,他的本質仍是一隻猴子,可是他又有變化後的一些本領(功能)code

 

實現:裝飾類包含原有類的實例對象,便可實現裝飾器模式對象

 

開始:blog

定義一個形狀的接口繼承

//畫圖接口
public interface Shape { void draw(); }

定義一個長方形的類去實現咱們的形狀接口,實現畫出一個長方形的功能接口

public class Rectangle implements Shape { @Override public void draw() { System.out.println("畫出長方形"); } }

定義一個圓形的類去實現咱們形狀,畫出圓ci

public class Circle implements Shape { @Override public void draw() { System.out.println("畫出一個圓形"); } }

 

//須要一個包裝類,抽象類,而且實現被包裝對象的接口

public abstract class Decorator implements Shape { protected Shape shape; public Decorator(Shape shape) { this.shape = shape; } @Override public void draw() { shape.draw(); } }

 

//具體的加入新功能的包裝類實現類 繼承這個包裝抽象類

public class RedDecorator extends Decorator { public RedDecorator(Shape shape) { super(shape); } @Override public void draw() { super.draw(); //實現一個新的裝飾
        System.out.println("實現紅色包裝"); } }

 

//開始測試

public static void main(String[] args) { //紅色長方形包裝類
        Shape rectangle = new RedDecorator(new Rectangle()); Shape circle = new RedDecorator(new Circle()); rectangle.draw(); circle.draw(); }

//而後,形象的截圖表示一下,

 

 淺談:


學到這裏,大體總結一下,本來的Shape(形狀)接口只是用來畫出具體的形狀,好比圓形,長方形,沒有具體的顏色這一功能。

就比如剛開始提到的,在不改變原有類結構的狀況下,加入一項新的功能。咱們在這個程序裏面加入的是一項紅色的包裝這一功能。

 

具體的實現就是須要一個抽象包裝類去實現原有功能的接口,而後引入一個具體的實例對象,而且使用實例的具體方法。好比draw();

 

具體相加如什麼功能,就用具體的一個類去繼承這個抽象類,由於這個抽象類自己已經實現了Shape 因此具體實現的 RedDecorator自己也就是一個Shape的一個實例。

 

具體的調用就能夠了!

 

暫時的理解就這麼多,仍是得須要多研究 ,歡迎批評指正!

相關文章
相關標籤/搜索