設計模式之二裝飾者模式

2021-08-03 03:44:22 字數 2148 閱讀 9868

一 概述

1.什麼是裝飾者模式?

在不修改類,不使用繼承的前提下,用乙個物件來裝飾另乙個物件,以擴充套件目標物件的功能。

2.裝飾者模式的作用:

繼承也可以擴充套件類的功能,裝飾者模式比繼承更加靈活,因為繼承時子類受父類的約束,比如子類

方法不能降低訪問許可權,返回值必須是父類方法返回值的子類,而裝飾模式就不受這些約束,比較靈活。

二 基本裝飾者模式

結構:

三 高階裝飾者模式

1.不僅可以對目標物件進行多種形式的增強,而且可以構建裝飾者鏈將多種增強形式同時施加到目標物件上。

3.按照功能模組化原則,乙個模組只負責單一的功能,每一種具體裝飾者類,只負責實現一種增強形式。

4.具體裝飾者類對目標類的增強建立在基類處理結果的基礎上,因此在**中通過先super獲取基類的結果,

然後再進行增強。

5.構建裝飾者鏈

⑴基本原理:

首先將目標物件傳入乙個具體裝飾者物件中,再將該具體裝飾者物件傳入下乙個具體裝飾者物件中,以此推進,

形成乙個裝飾者鏈,對目標物件逐級增強。

⑵構建關鍵:

在具體裝飾者類中通過super獲取基類處理結果,將基類作為中間環節構建裝飾者鏈。

⑶實現demo

介面

package

com.designmode.decorator.senior;

public

inte***ce

isomeservice

目標類

package

com.designmode.decorator.senior;

public

class someserviceimpl implements

isomeservice

}

裝飾者基類

package

com.designmode.decorator.senior;

public

isomeservice

@override

public

string dosome()

}

具體裝飾者a類

package

com.designmode.decorator.senior;

public

class trimdecorator extends

public

trimdecorator(isomeservice target)

@override

public

string dosome()

}

具體裝飾者b類

package

com.designmode.decorator.senior;

public

class upperdecorator extends

public

upperdecorator(isomeservice target)

@override

public

string dosome()

}

測試類

package

com.designmode.decorator.senior;

import

org.junit.test;

public

class

decoratortest

/*** 一次增強,對裝飾者基類增強

*/@test

public

void

test02()

/*** 形成裝飾者鏈,逐級增強

*/@test

public

void

test03()

}

三 常見裝飾者應用

io流中廣泛使用裝飾者模式,一些類正是裝飾了基本輸入輸出流建立的,如xmlwriter\dateoutputstream\

bufferedinputstream\

objectinputstream等。

四 與靜態**模式對比

1.相同點:

2.不同點

⑴設計目的不同:

⑵包含目標物件的方式不同:

注:靜態**模式請參考

Java設計模式之二裝飾模式

一 什麼是裝飾設計模式?裝飾模式是在不必改變原類檔案和使用繼續的情況下,動態的擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是通過裝飾來包裹真實的物件。二 裝飾模式的特點 1 裝飾物件和真實物件有相同的介面。這樣客戶端物件就可以以和真實物件相同的方式和裝飾物件互動。2 裝飾物件包含乙個真實物...

Java 設計模式(二) 裝飾者模式

一 簡介 裝飾者模式要求有乙個被裝飾物件及多個裝飾者,每個裝飾者與被裝飾者實現同乙個介面或有同乙個超類,被裝飾者持有乙個裝飾者物件,所有實現由持有物件完成,裝飾者則在方法執行過程中增強方法實現 如 在方法執行前進行許可權驗證,在返回結果前進行加密處理等 二 示例 要求 商家活動要求商品具有多種打折方...

設計模式 裝飾者模式

public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...