裝飾者模式

2021-10-24 10:24:42 字數 3109 閱讀 8953

裝飾者模式(decorator pattern)是指在不改變原有物件的基礎之上,將功能附加到對 象上,提供了比繼承更有彈性的替代方案(擴充套件原有物件的功能),屬於結構型模式。

裝飾者在**程式中適用於以下場景:

1、用於擴充套件乙個類的功能或給乙個類新增附加職責。

2、動態的給乙個物件新增功能,這些功能可以再動態的撤銷。

一般來說裝飾者模式有下面幾個參與者:

首先建立乙個煎餅 battercake 類:

public

class

battercake

public

intgetprice()

}

建立乙個加雞蛋的煎餅 battercakewithegg 類:

public

class

battercakewithegg

extends

battercake

@override

public

intgetprice()

}

再建立乙個既加雞蛋又加香腸的 battercakewitheggandsausage 類:

public

class

battercakewitheggandsausage

extends

battercake

@override

public

intgetprice()

}

編寫客戶端測試**:

public

class

test

}

執行結果:

煎餅,總**:5

煎餅+1 個雞蛋,總**:6

煎餅+1 根香腸,總**:7

執行結果沒有問題。但是,如果使用者需要乙個加 2 個雞蛋加 1 根香腸的煎餅,那麼用我 們現在的類結構是建立不出來的,也無法自動計算出**,除非再建立乙個類做定製。 如果需求再變,一直加定製顯然是不科學的。那麼下面我們就用裝飾者模式來解決上面 的問題。首先建立乙個建煎餅的抽象 battercake 類:

public

abstract

class

battercake

建立乙個基本的煎餅(或者叫基礎**)basebattercake:

public

class

basebattercake

extends

battercake

public

intgetprice()

}

然後,再建立乙個擴充套件**的抽象裝飾者 battercakedecotator 類:

public

abstract

class

battercakedecotator

extends

battercake

protected

abstract

void

dosomething()

;public string getmsg()

public

intgetprice()

}

然後,建立雞蛋裝飾者 eggdecorator 類:

public

class

eggdecorator

extends

battercakedecotator

protected

void

dosomething()

@override

public string getmsg()

@override

public

intgetprice()

}

建立香腸裝飾者 sausagedecorator 類:

public

class

sausagedecorator

extends

battercakedecotator

protected

void

dosomething()

@override

public string getmsg()

@override

public

intgetprice()

}

編寫客戶端測試**:

public

class

test2

}

來看一下類圖:

裝飾者模式

介面卡模式

形式是一種非常特別的介面卡模式

沒有層級關係,裝飾器模式有層級關係

定義裝飾者和被裝飾者都實現同乙個接 口,主要目的是為了擴充套件之後依舊保 留 oop 關係

介面卡和被適配者沒有必然的聯絡,通 常是採用繼承或**的形式進行包裝

關係滿足 is-a 的關係

滿足 has-a 的關係

功能注重覆蓋、擴充套件

注重相容、轉換

設計前置考慮

後置考慮

裝飾器模式在原始碼中也應用得非常多,在 jdk 中體現最明顯的類就是 io 相關的類,如 bufferedreader、inputstream、outputstream,看一下常用的 inputstream 的類結 構圖:

優點:1、裝飾者是繼承的有力補充,比繼承靈活,不改變原有物件的情況下動態地給乙個物件 擴充套件功能,即插即用。

2、通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果。

3、裝飾者完全遵守開閉原則。

裝飾者模式

裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...

裝飾者模式

裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...

裝飾者模式

裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...