設計模式 裝飾者模式

2021-08-08 07:12:09 字數 2722 閱讀 3219

在學習設計模式的時候,發現裝飾這模式和**模式在某些地方是很相像的,那麼具體又有什麼區別和聯絡呢?讓我們根據例項來看一看:

1. 裝飾者模式:

其實裝飾者模式顧名思義,就是可以給乙個物件動態增加新的功能。使用裝飾者模式時,需要提供乙個公共的介面或抽象類。要求公共的裝飾類和被裝飾類實現同乙個介面,並且裝飾物件持有被裝飾物件的例項。而所有的「裝飾」都是繼承自公共的裝飾類的。

裝飾者模式的特點如下:

(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動。

(2) 裝飾物件包含乙個真實物件的引用(reference)

(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求**給真實的物件。

(4) 裝飾物件可以在**這些請求以前或以後增加一些附加功能。這樣就確保了在執行時,不用修改給定物件的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是通過繼承來實現對給定類的功能擴充套件。

看文字實在是有點頭疼,以下是以汽車(car)為例子的乙個裝飾者模式例項:

首先建立乙個car介面
package designpatterns.decorator;

/** * created by olive on 2017/9/11.

*/public inte***ce car

建立乙個car的實現類
package designpatterns.decorator;

/** * created by olive on 2017/9/11.

*/public class carimpl implements car

public int getprice()

}

建立公共的裝飾者類
package designpatterns.decorator;

/** * created by olive on 2017/9/11.

*/public class cardecorator implements car

public void decorate()

public int getprice()

}

以下為兩個繼承至cardecorator的兩個裝飾
package designpatterns.decorator;

/** * created by olive on 2017/9/11.

*/public class sunroof extends cardecorator

@override

public void decorate()

@override

public int getprice()

}

package designpatterns.decorator;

/** * created by olive on 2017/9/11.

*/public class perfume extends cardecorator

@override

public void decorate()

@override

public int getprice()

}

然後來跑一下這個例子吧!!!
package designpatterns.decorator;

/** * created by olive on 2017/9/11.

* * 裝飾器模式的應用場景:

1、需要擴充套件乙個類的功能。

2、動態的為乙個物件增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)

*/public class cardecoratortest

}

結果如下:

car's price : 100000

this is a car!

now this car has a sunroof!

car's price : 110000

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

this is a car!

now this car has a bottle of perfume! and need a beauty xd~~

car's price : 101000

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

this is a car!

now this car has a sunroof!

now this car has a bottle of perfume! and need a beauty xd~~

car's price : 111000

上面例項的邏輯框圖如下:

下次寫下**模式(靜態**和動態**),然後和裝飾者模式對比下~

設計模式 裝飾者模式

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

設計模式 裝飾者模式

沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...

設計模式 裝飾者模式

好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...