設計模型之裝飾者模式 含UML完整例項

2021-10-04 22:36:52 字數 4587 閱讀 2655

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...