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


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

所屬與結構型模式,

這種模式的特點是:需要創建一個裝飾類來包裝原有的類,並且提供額外的功能。

 

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

舉例子:悟空擁有七十二變,不管它怎么變化,他的本質還是一只猴子,但是他又有變化后的一些本領(功能)

 

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

 

開始:

定義一個形狀的接口

//畫圖接口
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的一個實例。

 

具體的調用就可以了!

 

暫時的理解就這么多,還是得需要多研究 ,歡迎批評指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM