1. 程式人生 > >一天一個設計模式:裝飾者模式

一天一個設計模式:裝飾者模式

概念:

  裝飾者模式又稱為包裝(wrapper)模式。裝飾者模式對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。

結構:

  裝飾者模式以透明的方式給一個物件附加上更多的責任,換而言之,客戶端並不會覺得物件在裝飾前後有什麼不同,裝飾者模式可以在不使用創造更多子類的情況下,將物件的功能拓展。

結構圖:

角色分析:

    抽象構件(Component)角色:給出一個抽象介面,以規範準備接受附加責任的物件。

  具體構件(ConCreteComponent)角色:定義一個將要接受附加責任的類。

  裝飾(Decorator)角色:持有一個構件(Component)物件的例項,並定義一個與抽象構件介面一致的介面。

  具體裝飾(ConcreteDecorator)角色:負責給構件物件“貼上”附加的責任。

程式碼:

抽象構建角色:

public interface Component {
    
    public void sampleOperation();
    
}
View Code

具體構件角色:

public class ConcreteComponent implements Component {

    @Override
    public void sampleOperation() {
        // 寫相關的業務程式碼
    }

}
View Code

裝飾者角色:

public class Decorator implements Component{
    private Component component;
    
    public Decorator(Component component){
        this.component = component;
    }

    @Override
    public void sampleOperation() {
        // 委派給構件
        component.sampleOperation();
    }
    
}
View Code

具體裝飾者角色:

public class ConcreteDecoratorA extends Decorator {

    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    
    @Override
    public void sampleOperation() {
     super.sampleOperation();
        // 寫相關的業務程式碼
    }
}
//B元件類似

具體示例

有工人介面,我們定義了鐵匠,現在要對鐵匠進行不同的技能強化。

工人介面:

public interface Worker {

    void working();
}
View Code

鐵匠實現類:

public class Smith implements Worker {

    private String name;

    private int age;

    public Smith(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public void working() {
        System.out.println("我是一個鐵匠");
    }
}
View Code

技能實現類:

public class Skill implements Worker {
    private Worker worker;

    public Skill(Worker worker) {
        this.worker = worker;
    }

    @Override
    public void working() {
        worker.working();
    }

    //為半透明模式做的拓展
    public void heating(){}
}
View Code

具體的技能類1:

public class Hardening extends Skill {
    public Hardening(Worker worker) {
        super(worker);
    }

    @Override
    public void working() {
        System.out.println("我在淬火");
    }
}
View Code

具體的技能類2:

public class Beat extends Skill {
    public Beat(Worker worker) {
        super(worker);
    }

    @Override
    public void working() {
        System.out.println("我在反覆地捶打");
    }
}
View Code

補充:

裝飾者模式的簡化

1.去掉介面的形式,直接繼承自要被裝飾的類即可。

2.直接使用實現介面的形式實現裝飾,而不用再額外加一層繼承關係。適用於只有一個強化關係的情況

透明度的要求:

  裝飾者模式要求程式不應該宣告需要被裝飾的實體類,而是應該宣告抽象介面。

用示例中的宣告表示就是下面這樣:

即所有的人,都是工人,鐵匠是工人,會淬火的鐵匠也是工人。

        Worker worker1 = new Smith("李鐵蛋",18);
        Worker worker2 = new Hardening(worker1);
View Code

半透明的裝飾模式:

  當發現工人介面並不能滿足所有的要求的時候,要想實現透明度要求,必須在介面中新增新方法,所以很多實現的裝飾者模式都是採取“半透明”的方式,即裝飾者類可以對介面進行拓展,同時宣告的時候,可以選擇以裝飾者類為準。

  本例中,裝飾者類就是技能類,我們為淬火技能類新增加熱方法

        Worker worker = new Smith("李狗蛋",18);
        Hardening smith = new Hardening(worker);
        smith.heating();
View Code

  半透明的裝飾者模式是介於裝飾者模式跟介面卡模式中的,介面卡模式的思路是改變介面,也可以通過改寫或新增方法實現,大多數裝飾者模式實際上都是半透明的裝飾者模式。

相關推薦

天一設計模式裝飾模式

概念:   裝飾者模式又稱為包裝(wrapper)模式。裝飾者模式對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。 結構:   裝飾者模式以透明的方式給一個物件附加上更多的責任,換而言之,客戶端並不會覺得物件在裝飾前後有什麼不同,裝飾者模式可以在不使用創造更多子類的情況下,將物件的功能拓展。

小白設計模式裝飾模式

定義 能夠動態的給物件增加行為職責的一種模式,靈活性遠勝於繼承。 主要組成 抽象元件(Component): 定義抽象行為介面。 具體元件(Concrete component): 定義具體實現行為介面的類,繼承自抽象元件,也做被裝飾者,用於被附加各種行為。 抽象裝飾者(Decorator):持有一

Java設計模式裝飾模式

原文連結 譯者:秦建平 裝飾者模式可以給已經存在的物件動態的新增能力。下面,我將會用一個簡單的例子來演示一下如何在程式當中使用裝飾者模式。 1.裝飾者模式 讓我們來假設一下,你正在尋找一個女朋友。有很多來自不同國家的女孩,比如:美國,中國,日本,法國等等,他們每個人都有不一樣的個性和興趣愛好,

設計模式裝飾模式(Decorator Pattern)

設計模式:裝飾者模式(Decorator Pattern) /** * 裝飾者模式。 * @author Bright Lee */ public class DecoratorPattern { public static void main(String[

c++設計模式裝飾模式(Decorator Pattern)

定義: 裝飾者模式動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。 場景: 我們購買咖啡的時候,可以要求在其中加入各種調料,例如:蒸奶、豆漿、摩卡或覆蓋奶泡,而咖啡店也會根據所加入的調料收取不同的費用,所以當我們設計訂單系統的時候就

設計模式裝飾模式介紹及程式碼示例 && JDK裡關於裝飾模式的應用

# 0、背景 來看一個專案需求:咖啡訂購專案。 咖啡種類有很多:美式、摩卡、義大利濃咖啡; 咖啡加料:牛奶、豆漿、可可。 要求是,擴充套件新的咖啡種類的時候,能夠方便維護,不同種類的咖啡需要快速**計算多少錢**,客戶單點咖啡,也可以咖啡+料。 ### 最差方案 直接想,就是一個咖啡基類,然

天一設計模式---裝飾模式

優點:它可以動態為物件新增功能。 場景:我們希望為某個物件而不是整個類新增一些功能。 一、角色及作用 裝飾者和被裝飾者擁有相同的元件介面。被裝飾者是系統的核心元件,完成特定功能。裝飾者則可以在被裝飾者的方法前後,加上特定的前置處理和後置處理,增強被裝飾

天一設計模式介面卡模式

概念:   介面卡模式是把一個類的介面變成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。 用途:   就像插頭轉換器,之前入了switch港版,插頭是英式的,還好附贈一個插頭轉換器,介面卡就相當於這個轉換器。 種類:   分為類的介面卡與物件的介面卡兩種

天一設計模式工廠方法模式

工廠方法模式:   定義一個生產產品物件的工廠介面,將建立生產產品的工廠的工作交給子類實現。   隨著實際需要的工廠數量增加,簡單工廠模式體積會迅速膨脹,程式碼迅速臃腫嚴重。  補充:工廠方法模式是針對一類產品的工廠   所以為了程式碼的可閱讀下與可維護性,也做到不同的業務有一定的隔離,將工廠的功能抽象出來成

天一設計模式策略模式

概念:   策略模式屬於物件的行為模式,其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響客戶端的情況下變化。 結構: 環境(Context)角色:持有一個Strategy的引用。 抽象策略(Strategy)角色:這是一個抽象角色

天一設計模式抽象方法模式

為什麼引入抽象工廠模式? 或者說抽象工廠模式與工廠方法模式的區別? 工廠方法模式針對的是一類產品的等級結構,而抽象工廠模式針對的是多個產品等級結構(一個產品族)。 引入概念:產品族與產品等級 產品族:指在不同的產品等級結構中,功能相關聯的產品組成的家族。產品等級:同類產品的不同產品區分。 抽象工廠的作用:

天一設計模式建造模式

概念:   建造模式是物件的建立模式,建造模式可以將一個產品的內部表象(個人理解,可以稱為元件)與產品的生產分割開來,從而可以使一個建造過程生產出來具有不同內部表象的產品物件。 概念: 產品的內部表象:   產品不同組成成分構成(元件)這些零件可以是物件,也可以是非物件,稱為內部表象(internal re

天一設計模式單例模式

概念:   作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化,並向整個系統提供這個例項。 特點:   1.單例類只能有一個例項   2.單例類必須建立自己的唯一例項   3.單例類必須給其他所有物件提供這一例項。 餓漢式單例類 public class EagerSingleton {

天一設計模式模板方法模式

概念:   模板方法模式是類的行為模式,準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的意思。 結構:   模板方法模式中,抽象類負責定義整個的邏輯框架,

php設計模式裝飾模式

decorator tac coff cti cor ring 咖啡 parent namespace Beverage.php <?php namespace DesignPattern; abstract class Beverage { /**

天一設計模式(五) - 適配器模式(Adapter)

p s func 靈活性 nsh ans target 多線程 isp pattern 前言 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 適配器模式的用途 最經典的就是電器的例子,筆記本電腦的插

天一設計模式(四) - 原型模式(Prototype)

管理員 ans rip prototype register 性能 除了 func comm 前言 原型模式屬於對象的創建模式。通過給出一個原型對象來指明所有創建的對象的類型,然後用這個原型對象提供的復制辦法創建出更多同類型的對象。 原型模式的結構 原型模式要求對象實現

天一設計模式() - 總體概述

享元 關註 責任鏈 分布式 分享圖片 模板方法 mage upload 抽象工廠 前言 最近在對設計模式進行了一系列總結,本文將給大家關於設計模式的一個整體的介紹。 正文 1. 定義 設計模式是某類特定問題的代碼設計解決方案,是一套代碼設計的經驗總結。 2. 作用 提高

設計模式12裝飾模式

裝飾者模式 裝飾器模式是一種用於代替繼承的技術,無需通過繼承增加子類就能擴充套件物件的新功能。使用物件的關聯關係代替繼承關係,更加靈活,同時避免型別體系的快速膨脹。 怎麼說?老樣子,先設想個場景 假如我要去樓下買手抓餅吃,一般來說,手抓餅都會提供不同的配料,比如加雞蛋,加雞柳,加肉鬆或者

設計模式裝飾模式

一點 ron 測試類 實現類 stub generated class void nbsp 一.裝飾者模式特點:1.裝飾者和被裝飾者對象有相同的超類2.可以用一個或多個裝飾者包裝一個對象3.由於裝飾者和被裝飾者具有相同超類,所以任何需要被包裝對象的場合,可以用裝飾過的對象代