裝飾模式

1 前言


O(∩_∩)O 首先呢,在這先祝各位濕兄濕姐圣誕節(jié)快樂,多多吃蘋果。

今天呢,我們來講講裝飾模式,裝飾模式就是包裝模式,簡單的說就是通過一種對客戶端透明的方式來拓展對象的功能,是繼承關(guān)系的一種替代方案。

就拿我們經(jīng)常吃的的蘋果來說吧,在平安夜之前,蘋果就是蘋果,但到了平安夜之際,蘋果就搖身一變成為平安果,這就是裝飾的力量,不論是從外觀還是內(nèi)在的含義,經(jīng)過裝飾后都將大大的改變。

在jdk中,裝飾模式使用的也是很頻繁的,比如常見的I/O流,我們可以把一個簡單的字節(jié)流轉(zhuǎn)換成一個字節(jié)流,再將字節(jié)流轉(zhuǎn)換成緩沖流等。

接著呢,我們先來看看傳統(tǒng)的繼承關(guān)系來實現(xiàn)轉(zhuǎn)換過程。

2 繼承轉(zhuǎn)換


首先,我們先實現(xiàn)一個普通蘋果

實現(xiàn)

<!--蘋果接口--!>
public interface Apple {
    public void show();
    public void func();
}
<!--普通蘋果實現(xiàn)--!>
public class CommonApple implements Apple{

    @Override
    public void show() {
        this.func();
    }

    @Override
    public void func() {
        System.out.println("普通蘋果");
    }
}
普通蘋果

這樣我們的普通蘋果就出來了,先吃著。平安夜來了,我們要一個刻字的蘋果該怎么辦呢?

刻字蘋果實現(xiàn)

public class LetterApple implements Apple{
    @Override
    public void show() {
        this.func();
    }

    @Override
    public void func() {
        System.out.println("刻字蘋果");
    }
}
刻字蘋果

可以看到實現(xiàn)一個刻字蘋果只需要在創(chuàng)建一個類去實現(xiàn)蘋果就可以了,但我們不可能拿著一個沒有包裝盒的蘋果去送對象吧,所以呢,我們還需要實現(xiàn)一個包裝好的刻字蘋果。

包裝好的刻字蘋果

public class PackingAndLetterApple implements Apple{
    @Override
    public void show() {
        this.func();
    }

    @Override
    public void func() {
        System.out.println("包裝蘋果");
        System.out.println("刻字蘋果");
    }
}

這樣我們雖然是得到了包裝好的刻字蘋果,但是我們可以發(fā)現(xiàn)這種實現(xiàn)方式過于粗暴,代碼過于冗余,每當我們需要一個復雜的功能時都需要重新去實現(xiàn)一個類。

** 而裝飾模式就全完可以解決這個問題,當我們需要一個包裝好的刻字蘋果時,我們只需要先將普通蘋果裝飾成刻字蘋果再裝飾成包裝蘋果**就可以了。

3 裝飾模式


裝飾模式的幾個角色

  • 抽象組件角色:一個抽象接口,是裝飾者和被裝飾者的父接口。
  • 抽象裝飾角色:包含一個組件的應用,并定義與抽象組件一樣的方法。
  • 具體組件角色:為抽象組件的實現(xiàn)類。
  • 具體裝飾角色:為抽象裝飾角色的實現(xiàn)類,負責具體的裝飾。

具體的實現(xiàn):
實現(xiàn)一個包裝的刻字蘋果

抽象組件角色:Apple.class

public interface Apple {
    public void show();
    public void func();
}

抽象裝飾角色:AppleDecorator.class

public abstract class AppleDecorator implements Apple{
    private Apple apple;
    public AppleDecorator(Apple apple) {
        this.apple = apple;
    }
    public Apple getApple() {
        return apple;
    }

具體組件角色:LetterAppleDecorator.class / PackingAppleDecorator.class

public class LetterAppleDecorator extends AppleDecorator{
    private Apple apple;
    public LetterAppleDecorator(Apple apple) {
        super(apple);
    }
    @Override
    public void show() {
        this.getApple().show();
        this.func();
    }

    @Override
    public void func() {
        System.out.println("刻字蘋果");
    }
}
public class PackingAppleDecorator extends AppleDecorator{
    private Apple apple;
    public PackingAppleDecorator(Apple apple) {
        super(apple);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void show() {
        this.getApple().func();
        this.func();
    }

    @Override
    public void func() {
        System.out.println("高檔包裝蘋果");
    }
}

具體裝飾角色:CommonApple.class

public class CommonApple implements Apple{

    @Override
    public void show() {
        this.func();
    }
    @Override
    public void func() {
        System.out.println("蘋果");
    }

}

測試:MainClass.clas

public class MainClass {
    public static void main(String[] args) {
        Apple apple = new CommonApple();
        apple.func();
        System.out.println("`````````````````````````````````````````");
        apple = new LetterAppleDecorator(apple);
        apple.func();
        System.out.println("`````````````````````````````````````````");
        apple = new PackingAppleDecorator(apple);
        apple.func();
        System.out.println("`````````````````````````````````````````");
    }
    
}
運行結(jié)果

4 優(yōu)缺點


優(yōu)點

  • Decorator模式和繼承都是為了拓展對象的功能,但是很明顯Decorator模式更加靈活。
  • 當對一個對象有多種裝飾時,那么開發(fā)者也同時可以實現(xiàn)不同的行為組合。

缺點:

  • 裝飾模式會導致類的增多,會使程序變復雜,雖然變的比較靈活,但是響應的操作也會變復雜。

最后呢,還是祝大家圣誕節(jié)快樂,都能收到自己喜歡的禮物<a>(? ω ?)</a>。
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(●'?'●),
上一篇:建造者模式
下一篇:策略模式(待更)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • (轉(zhuǎn)載)原文地址 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述裝飾(Decorator)模式的: 裝飾模式又...
    zjk_00閱讀 684評論 0 2
  • 1 概述 在一個項目中,你會有非常多的因素考慮不到,特別是業(yè)務的變更,不時的冒出一個需求是很正常的情況。有三個繼承...
    今晚打肉山閱讀 370評論 0 0
  • 0x01 前言 ??裝飾器模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變...
    菩提樹下成魔閱讀 479評論 0 0
  • 老張駝背,一個眼晴瞇著笑,一個眼晴睜得圓,不搭配。老張打臨時工,見人挺和氣。站在窗口,我能俯瞰老張的王國,一個逼仄...
    萬象更新_f742閱讀 442評論 0 5
  • 人生苦短,去做你想做的事,成為你想成為的人。很多時候你之所以沒有成功,是因為你不想成功,你的成功欲念不夠強烈,所以...
    聆聽者JYZ閱讀 305評論 0 0

友情鏈接更多精彩內(nèi)容