在不改變現有類結構的狀況下,爲這個類添加一個新的功能,這就是裝飾器模式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的一個實例。
具體的調用就能夠了!
暫時的理解就這麼多,仍是得須要多研究 ,歡迎批評指正!