裝飾模式

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

裝飾模式可以,可以動態(tài)地為一個對象(注意是對象,不是類)添加功能,而不是通過繼承來擴展整個類。

LCD- 最低共同點

/**
 * Lowest Common Denominator
 */
public interface LCD {
    void doIt();
}

核心被包裝類

/**
 * 被包裝的核心類實現(xiàn)LCD
 */
public class Core implements LCD {
    @Override
    public void doIt() {
        System.out.println("Core - I am closed for modification.");
    }
}

裝飾器基類

/**
 * 抽象裝飾器也實現(xiàn)LCD("is a LCD"),并且"has a LCD"
 */
public abstract class AbstractDecorator implements LCD {
    // has a LCD
    private LCD core;

    public AbstractDecorator(LCD inner) {
        core = inner;
    }

    public void doIt() {
        if (core != null) {
            core.doIt();
        }
    }
}

注意裝飾器基類不僅是一個LCD,同時擁有一個LCD。

具體裝飾器類

public class DecoratorA extends AbstractDecorator {
    public DecoratorA(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doA();
    }

    private void doA() {
        System.out.println("A");
    }
}

public class DecoratorB extends AbstractDecorator {
    public DecoratorB(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doB();
    }

    private void doB() {
        System.out.println("B");
    }
}

public class DecoratorC extends AbstractDecorator {
    public DecoratorC(LCD inner) {
        super(inner);
    }

    public void doIt() {
        super.doIt();
        doC();
    }

    private void doC() {
        System.out.println("C");
    }
}

執(zhí)行

public class Test {
    public static void main(String[] args) {
        DecoratorA a = new DecoratorA(new Core());
        a.doIt();
        System.out.println("-----------------------------------");

        DecoratorB b = new DecoratorB(a);
        b.doIt();
        System.out.println("-----------------------------------");

        // 一層一層的包裝
        // 不需要去繼承Core類,就可以為其添加額外的功能
        DecoratorC c = new DecoratorC(new DecoratorB(new DecoratorA(new Core())));
        c.doIt();
    }
}

類圖

decorator.png

參考:

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

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

  • 1 概述 在一個項目中,你會有非常多的因素考慮不到,特別是業(yè)務(wù)的變更,不時的冒出一個需求是很正常的情況。有三個繼承...
    今晚打肉山閱讀 366評論 0 0
  • 設(shè)計模式———裝飾模式 例子:成績單報告 在面向?qū)ο蟮脑O(shè)計中,如果超過兩層繼承,可能就出設(shè)計問題了。這是經(jīng)驗總結(jié),...
    書筆年華閱讀 500評論 0 0
  • 1. 概述 demo地址,歡迎star 2. 問題 3. 解決方案 裝飾器模式: 動態(tài)地給一個對象添加一些額外的...
    barry閱讀 305評論 0 0
  • Yesterday,I finished the last episode of Friends.Rachel g...
    花鹽說閱讀 185評論 0 0
  • 前幾天遇到了一個由于分類引起的 Bug, 折騰了好久才找到根源點,過程甚是糾結(jié)。于是對分類這塊有一些想法啦,想想平...
    天空中的球閱讀 1,362評論 2 6

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