1. 程式人生 > >Java描述設計模式(09):裝飾模式

Java描述設計模式(09):裝飾模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、場景描述

孫悟空有七十二般變化,他的每一種變化都給他帶來一種附加的本領。他變成魚兒時,就可以到水裡游泳;他變成鳥兒時,就可以在天上飛行。

2、場景圖解

3、程式碼實現

public class C01_InScene {
    public static void main(String[] args) {
        TheGreatestSage greatestSage = new Monkey();
        TheGreatestSage fish = new Fish(greatestSage);
        fish.shapeDesc();
        // 這裡雖然是魚形態,但是本體是悟空,所以可以直接變化
        TheGreatestSage bird = new Bird(fish);
        bird.shapeDesc();
    }
}
// 頂級介面
interface TheGreatestSage {
    // 定義一個描述形態的方法
    void shapeDesc ();
}
// 悟空本尊
class Monkey implements TheGreatestSage{
    @Override
    public void shapeDesc() {
        System.out.println("Monkey.move()");
    }
}
// 包裝一層變化的描述
class Change implements TheGreatestSage {
    private TheGreatestSage greatestSage;
    Change(TheGreatestSage greatestSage){
        this.greatestSage = greatestSage;
    }
    @Override
    public void shapeDesc() {
        greatestSage.shapeDesc();
    }
}
// 具體的變化形態
class Fish extends Change{
    public Fish(TheGreatestSage greatestSage) {
        super(greatestSage);
    }
    public void shapeDesc(){
        System.out.println("魚在水中游...");
    }
}
class Bird extends Change{
    public Bird(TheGreatestSage greatestSage) {
        super(greatestSage);
    }
    public void shapeDesc(){
        System.out.println("鳥在空中飛...");
    }
}

二、裝飾模式

1、基礎概念

裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。 裝飾模式以對客戶透明的方式動態地給一個物件附加上更多的責任。換言之,客戶端並不會覺得物件在裝飾前和裝飾後有什麼不同。裝飾模式可以在不使用創造更多子類的情況下,將物件的功能加以擴充套件。

2、核心角色

  • 抽象構件角色

給出一個抽象介面,以規範準備接收附加責任的物件。

  • 具體構件角色

定義一個將要接收附加責任的類。

  • 裝飾角色

持有一個構件物件的例項,並定義一個與抽象構件介面一致的介面。

  • 具體裝飾角色

負責給構件物件“貼上”附加的責任。

3、模式圖解

4、原始碼實現

// 抽象構件角色
interface Component {
    void sampleOperation();
}
// 具體構件角色
class ConcreteComponent implements Component{
    @Override
    public void sampleOperation() {
        System.out.println("業務相關程式碼");
    }
}
//裝飾角色
class Decorator implements Component{
    private Component component;
    public Decorator(Component component){
        this.component = component;
    }
    @Override
    public void sampleOperation() {
        //委派給構件進行處理
        component.sampleOperation();
    }
}
// 具體裝飾角色
class ConcreteDecoratorA extends Decorator{
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        super.sampleOperation();
        System.out.println("A.處理相關業務的程式碼");
    }
}
class ConcreteDecoratorB extends Decorator{
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    @Override
    public void sampleOperation() {
        super.sampleOperation();
        System.out.println("B.處理相關業務方法");
    }
}

5、該模式簡化

  • 簡化抽象類

如果只有一個ConcreteComponent類,那麼可以考慮去掉抽象的Component類(介面),把Decorator作為一個ConcreteComponent子類。

  • 簡化裝飾類

如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合併成一個類。

6、半透明說明

1)、純粹的裝飾模式很難找到。裝飾模式的用意是在不改變介面的前提下,增強類的功能。

2)、在增強功能的時候,往往需要建立新的公開的方法。

3)、這就導致了大多數的裝飾模式的實現都是“半透明”的,而不是完全透明的。換言之,允許裝飾模式改變介面,增加新的方法。這意味著客戶端可以宣告ConcreteDecorator型別的變數,從而可以呼叫ConcreteDecorator類中才有的方法。

4)、半透明的裝飾模式是介於裝飾模式和介面卡模式之間的。介面卡模式的用意是改變類的介面,也可以通過改寫一個或幾個方法,或增加新的方法來增強類的功能。

5)、大多數的裝飾模式實際上是半透明的裝飾模式,這樣的裝飾模式也稱做半裝飾、半介面卡模式。

三、實際應用

1、JDK中IO流

1)、基本描述

裝飾模式在Java語言中的最經典的應用就是Java I/O類庫的設計。很少單一的建立流物件,通過建立多個疊合物件來提供所期望的IO流功能,因此裝飾模式是Java I/O類庫的基本模式。

2)、IO流圖解描述

  • 抽象構件角色

由InputStream扮演。這是一個抽象類,為各種子型別提供統一的介面。

  • 具體構件角色

由FileInputStream、StringBufferInputStream等類扮演。它們實現了抽象構件角色所規定的介面。

  • 抽象裝飾角色

由FilterInputStream扮演。它實現了InputStream所規定的介面。

  • 具體裝飾角色

由幾個類扮演,分別是BufferedInputStream、DataInputStream以及兩個不常用到的類LineNumberInputStream、PushbackInputStream。

四、優缺點總結

1、模式的優點

(1)裝飾模式與繼承關係的目的都是要擴充套件物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統動態決定“貼上”一個需要的“裝飾”,或者除掉一個不需要的“裝飾”。繼承關係則不同,繼承關係是靜態的,它在系統執行前就決定了。

(2)通過使用不同的具體裝飾類以及這些裝飾類的排列組合,工程師可以創造出很多不同行為的組合。

2、模式的優點

由於使用裝飾模式,可以比使用繼承關係需要較少數目的類。使用較少的類,當然使設計比較易於進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關係更多的物件。

五、原始碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

相關推薦

Java描述設計模式(09)裝飾模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 孫悟空有七十二般變化,他的每一種變化都

java常用設計模式裝飾模式

一、概念  裝飾模式可以在不改變一個物件本身功能的基礎上給物件增加額外的新行為。 基本角色: 抽象構件:它是具體構件和抽象裝飾類的共同父類,聲明瞭在具體構件中實現的業務方法,它的引入可以使客戶端以一致的方式處理未被裝飾的物件以及裝飾之後的物件,實現客戶端的透明操作。 具體構件:它是抽

設計模式模式PK裝飾模式VS適配器模式

角度 朋友 hit 擴展 override 轉換 展現 調用 代理 1、概述 裝飾模式和適配器模式在通用類圖上沒有太多的相似點,差別比較大,但是它們的功能有相似的地方:都是包裝作用,都是通過委托方式實現其功能。不同點是:裝飾模式包裝的是自己的兄弟類,隸屬於同一個家族(相同接

設計模式裝飾模式

裝飾模式用於動態的往元件(Component)上新增功能。主要使用的場所為: 需要擴充套件一個類的功能,或給一個類增加附加責任。 需要動態的給一個物件增加功能,這些功能可以再動態地撤銷。 需要增

C#設計模式裝飾模式

裝飾模式(Decorator): 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生在子類更為靈活 UML類圖 Component 是定義一個物件介面,可以給這些

c# 設計模式裝飾模式

如果 透明 組件 通過 繼續 color [] 接收 lin 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手機添加貼膜,手機掛件,手機外殼等,如果此時利用繼承來實現的話,就需要定義無數的類,如StickerPhone(貼膜是手機類)、Accesso

Java設計模式12裝飾模式

裝飾器模式 裝飾器模式又稱為包裝(Wrapper)模式。裝飾器模式以多客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。 裝飾器模式的結構 通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修

JAVA設計模式(10)裝飾模式

裝飾器模式允許使用者向現有物件新增新功能而不改變其結構。 這種型別的設計模式屬於結構模式,因為此模式充當現有類的包裝器。此模式建立一個裝飾器類,它包裝原始類並提供附加功能,保持類方法簽名完整。我們通過以下示例展示裝飾器模式的使用,其中我們將用一些顏色裝飾形狀而不改變形狀類。 實現例項 在這個

Java描述設計模式(02)簡單工廠模式

一、生活場景簡介 1、引入場景 訂餐流程簡單描述 1)、食品抽象類,規定食品的基礎屬性操作 2)、魚類,雞肉類食品類擴充套件 3)

Java描述設計模式(08)橋接模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、橋接模式簡介 1、基礎描述 橋樑模式是物件的結構模式。又稱為柄

Java描述設計模式(10)組合模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、檔案系統 下圖是常見的計算機檔案系統的一部分。

Java描述設計模式(11)觀察者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、觀察者模式 1、概念描述 觀察者模式是物件的行為模式,又叫釋出

Java描述設計模式(13)迭代器模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、迭代器模式 1、基礎概念 迭代器模式又叫遊標模式,是物件的行為

Java描述設計模式(17)調停者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。 2、場景圖解 3、程式碼實

Java描述設計模式(18)享元模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、使用場景 應用程式碼 public class C01_InScene { public static void main(String[] args) { String c0 = "cicada" ; S

Java描述設計模式(19)模板方法模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 通常一款網際網路應用的開發流程如下:業務需求,規劃產品,程式開發,測試交付。現在基於模板方法模式進行該過程描述。 public class C01_InScene { public static void main(String

Java描述設計模式(23)訪問者模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、生活場景 1、場景描述 電競是遊戲比賽達到“競技”層面的體育專案。利用電子裝置作為運動器械進行的、人與人之間的智力對抗運動。通過電競,可以提高人的反應能力、協調能力、團隊精神等。但是不同人群的對電競的持有的觀念不一樣,有的人認為電競就是沉迷網路,

Java設計模式》之裝飾模式

情況 -s 抽象接口 output 就會 ati ack hba ensure 裝飾模式(Decorator) 1. 裝飾模式(Decorator)的定義:又名包裝(Wrapper)模式。裝飾模式以對client透明的方式擴展對象的功能,是繼承關系的一個替代方案。

C#設計模式之結構類模式裝飾模式

負責 gzip null pattern 產生 設計師 san 抽象 接口 定義(Decorator Pattern): 動態的給一個對象添加一些額外的職責。就添加功能來說,它相比生成子類更為靈活。 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手

“Head First 設計模式裝飾模式

裝飾模式 裝修模式 JAVAIO裝飾模式 裝飾模式 裝飾者模式:動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。 裝修模式的角色如下:抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。具體構件角色(Concrete Com