1.1 定義與特點
裝飾(decorator)模式的定義:指在不改變現有物件結構的情況下,動態地給該物件增加一些職責(即增加其額外功能)的模式,它屬於物件結構型模式。(有點像**模式的功能,**物件提供了與真實物件相同的方法,並可以擴充套件真實物件的功能)
裝飾(decorator)模式的主要優點有:
其主要缺點是:裝飾模式增加了許多子類,如果過度使用會使程式變得很複雜。
裝飾者模式和橋接模式的區別:
橋接模式關注點是各維度的組合通過組合關係來實現,而裝飾模式關注點時是在不改變現有物件結構的情況下,動態地給該物件增加一些職責。
1.2 模式的結構
裝飾模式主要包含以下角色。
抽象構件(component)角色:定義乙個抽象介面以規範準備接收附加責任的物件。
具體構件(concrete component)角色:實現抽象構件,通過裝飾角色為其新增一些職責。
抽象裝飾(decorator)角色:實現抽象構件,幷包含具體構件的例項,可以通過其子類擴充套件具體構件的功能。
1.3 問題由來
在現實生活中,常常需要對現有產品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟體開發過程中,有時想用一些現存的元件。這些元件可能只是完成了一些核心功能。但在不改變其結構的情況下,可以動態地擴充套件其功能。如果採用繼承的方式,隨著擴充套件功能的增多,會造成子類會很膨脹。
1.4 解決思路
如果採用繼承的方式,實現類物件擴充套件功能,會造成子類會很膨脹,所以我們在擴充套件類(裝飾類)組合原物件類,這樣當還要擴充套件新功能,只要把之前的擴充套件類放到新的擴充套件類,就可以疊加新功能了,並不改變原物件結構。
1.5 uml類圖
1.6 解決方案
/**
* @author 26530
* 奶茶
*/public
inte***ce
milktea
/**
* @author 26530
* 珍珠奶茶
*/public
class
pearlmilktea
implements
milktea
@override
public
float
getprice()
}
/**
* @author 26530
* 巧克力奶茶
*/public
class
chocolatemilktea
implements
milktea
@override
public
float
getprice()
}
/**
* @author 26530
* 燒仙草
*/public
class
herbaljellymilktea
implements
milktea
@override
public
float
getprice()
}
/**
* @author 26530
* 口味
*/public
abstract
class
addtastemilktea
implements
milktea
public
void
setmilktea
(milktea milktea)
public string getmilkname()
public
float
getprice()
}
/**
* @author 26530
* 少冰
*/public
class
addhalficemilktea
extends
addtastemilktea
@override
public string getmilkname()
@override
public
float
getprice()
public
addhalficemilktea
(milktea milktea)
}
/**
* @author 26530
* 去冰
*/public
class
addnoicemilktea
extends
addtastemilktea
public string getmilkname()
public
float
getprice()
public
addnoicemilktea
(milktea milktea)
}
/**
* @author 26530
* 全糖
*/public
class
addnormalsugermilktea
extends
addtastemilktea
public string getmilkname()
public
float
getprice()
public
addnormalsugermilktea
(milktea milktea)
}
/**
* @author 26530
* 無糖
*/public
class
addsugarfreemilktea
extends
addtastemilktea
public string getmilkname()
public
float
getprice()
public
addsugarfreemilktea
(milktea milktea)
}
/**
* @author 26530
* 選擇大杯,中杯,小杯
*/public
abstract
class
choosecapacitymilktea
implements
milktea
public
void
setmilktea
(milktea milktea)
public string getmilkname()
public
float
getprice()
}
/**
* @author 26530
* 大杯
*/public
class
largemilktea
extends
choosecapacitymilktea
public string getmilkname()
public
float
getprice()
public
largemilktea
(milktea milktea)
}
/**
* @author 26530
* 中杯
*/public
class
mediummilktea
extends
choosecapacitymilktea
public string getmilkname()
public
float
getprice()
public
mediummilktea
(milktea milktea)
}
/**
* @author 26530
* 小杯
*/public
class
smallmilktea
extends
choosecapacitymilktea
public string getmilkname()
public
float
getprice()
public
smallmilktea
(milktea milktea)
}
public
class
test
}
設計模型之建立者模式 含UML完整例項
1.1 定義與特點 建造者 builder 模式的定義 指將乙個複雜物件的構造與它的表示 給物件屬性賦值 分離,使同樣的構建過程可以建立不同的表示 給物件屬性賦值 這樣的設計模式被稱為建造者模式。它是將乙個複雜的物件分解為多個簡單的物件,然後一步一步構建而成。它將變與不變相分離,即產品的組成部分是不...
設計模型之工廠模式 含UML完整例項
1.1 定義 乙個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中。工廠方法模式的主要優點有 使用者只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體建立過程 在系統增加新的產品時只需要新增具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則 工廠方...
設計模型之命令模式含UML完整例項
1.1 定義與特點 命令 command 模式的定義如下 將乙個請求封裝為乙個物件,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令物件進行溝通,這樣方便將命令物件進行儲存 傳遞 呼叫 增加與管理。命令模式的主要優點如下 命令模式的缺點是 1.2 模式的結構 命令模式包含以下主要角色 1...