最近學習到設計模式,現總結個人學習裝飾者模式内容【注重的是過程,在不改變原有對象的基礎之上,将功能動态附加到對象上】。
上一篇:Java設計模式-橋接模式
文章目錄
- 定義
- 優缺點
-
- 優點
- 缺點
- 實作
-
- 代碼
- 測試
定義
裝飾模式指的是在不必改變原類檔案和使用繼承的情況下,動态地擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。通過裝飾類,包裝原有的類,不改變原有的結構[原有類方法簽名完整]的情況下添加新的功能。
優缺點
優點
- 不改變原有對象的情況下【動态】給一個對象擴充功能。(使用裝飾者可以在運作時決定,擴充某些功能)
- 通過使用不同裝飾類以及這些類的排列組合,可以實作不同的效果,同時符合開閉原則。
缺點
- 動态裝飾時,多層裝飾時會更複雜,會增加更多新的類,增加程式的複雜性。
實作
裝飾模式中的角色:
抽象構件(Component) 角色:Component是一個抽象類或接口,是要包裝的原始對象【這裡的Food(菜)類】。
具體構件(ConcreteComponent)角色:是Component的實作類,最終要裝飾的實際對象【這裡的PotatoSilk(洋芋絲)類】。
裝飾(Decorator)角色:是一個抽象類,繼承或實作了Component的接口,同時它持有一個對Component執行個體對象的引用,也可以有自己的方法【這裡的Decorator(裝飾)類】。
具體裝飾(ConcreteDecorator)角色:是Decorator的實作類,是具體的裝飾者對象,負責給ConcreteComponent附加責任【這裡的Salt(鹽)裝飾類】。
代碼
裝飾者模式和被裝飾的類要實作同一個接口,或者裝飾類是被裝飾的類的子類
原接口/抽象類以及具體實作類
/*
* 菜
*/
public abstract class Food {
String type;
Double price=0d;
abstract Double reckonPrice();
abstract String getType();
}
/**
* 洋芋絲
* @author cc百川
*/
class PotatoSilk extends Food{
PotatoSilk(){
type="洋芋絲";
price = 12.5d;
}
@Override
Double reckonPrice() {
return price;
}
String getType(){
return type;
}
}
裝飾類以及具體裝飾類
/**
* 裝飾模式可以是抽象類,可以定義好行為,減少子類的重複代碼
* ,繼承了food【用于修飾裝飾誰】,并聚合了food類
* @author cc百川
* 這裡裝飾類是被裝飾的類的子類
*/
public class Decorator extends Food{
Food food;//持有了被裝飾類的引用
@Override
Double reckonPrice() {
return price + food.reckonPrice();
}
String getType(){
return food.getType() + " "+type;
}
Decorator(Food food){
this.food = food;
}
}
/**
* 鹽裝飾類,繼承了裝飾類
* @author cc百川
*
*/
class Salt extends Decorator{
Salt(Food food) {
super(food);
type = " 鹽 ";
price = 0.5d;
}
}
/**
* 後期按照需求擴充的雞精
* @author cc百川
*
*/
class ChickenEssence extends Decorator{
ChickenEssence(Food food){
super(food);
type = " 雞精 ";
price = 0.15d;
}
}
測試
裝飾者模式,可用于動态添加功能【注意與代理的差別】
以上僅為個人學習,如果錯誤望指出,謝謝。