在不改變現有類結構的情況下,為這個類添加一個新的功能,這就是裝飾器模式
所屬與結構型模式,
這種模式的特點是:需要創建一個裝飾類來包裝原有的類,並且提供額外的功能。
為了解決:平時使用繼承的方式,會帶入許多靜態的方法,導致子類過度飽和,膨脹。
舉例子:悟空擁有七十二變,不管它怎么變化,他的本質還是一只猴子,但是他又有變化后的一些本領(功能)
實現:裝飾類包含原有類的實例對象,即可實現裝飾器模式
開始:
定義一個形狀的接口
//畫圖接口 public interface Shape { void draw(); }
定義一個長方形的類去實現我們的形狀接口,實現畫出一個長方形的功能
public class Rectangle implements Shape { @Override public void draw() { System.out.println("畫出長方形"); } }
定義一個圓形的類去實現我們形狀,畫出圓
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的一個實例。
具體的調用就可以了!
暫時的理解就這么多,還是得需要多研究 ,歡迎批評指正!