裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該盡量使用物件組合,而不是物件繼承來擴充套件和復用功能。裝飾器模式就是基於物件組合的方式,可以很靈活的給物件新增所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把複雜的功能簡單化,分散化,然後再執行期間,根據需要來動態組合的這樣乙個模式。
裝飾模式(decorator pattern)是指在不改變原有物件的基礎上,將功能附加到物件上,提供了比繼承更有彈性的方案(擴充套件原有物件的功能),屬於結構型模式。裝飾模式在生活中的應用也比較多,如給煎餅加雞蛋、給蛋糕加一些水果、給房子裝修等。都是在為物件擴充套件一些額外的職責。裝飾模式適用於以下場景:
①擴充套件乙個類的功能或給乙個類新增附加職責
②動態給乙個物件新增功能,這些功能可以再動態的撤銷。
裝飾器模式由元件和裝飾者組成。
抽象元件(component):需要裝飾的抽象物件。
具體元件(concretecomponent):是我們需要裝飾的物件
抽象裝飾類(decorator):內含指向抽象元件的引用及裝飾者共有的方法。
具體裝飾類(concretedecorator):被裝飾的物件。
假設我們現在去咖啡店要了一杯咖啡,可以加奶、加糖等等。咖啡和奶、糖分別有不同的**。
咖啡就是我們的元件,奶和糖是我們的裝飾者,現在我們要計算調製這樣一杯咖啡花費多少。
drink 介面類:
public
inte***ce
drink
coffee 類:
public
class
coffee
implements
drink
public string getdescription()
}
condimentdecorator 調味抽象類:裝飾器父類
public
abstract
class
condimentdecorator
implements
drink
public
float
cost()
public string getdescription()
}
milk 牛奶裝飾類:具體裝飾類
public
class
milk
extends
condimentdecorator
@override
public
float
cost()
@override
public string getdescription()
}
sugar 裝飾類:具體裝飾類
public
class
sugar
extends
condimentdecorator
@override
public
float
cost()
@override
public string getdescription()
}
測試**:
public
class
coffeeshop
}
package com.hanker.net;
//抽象元件
inte***ce
person
class
kobe
implements
person
}//裝飾器
class
persondecorator
implements
person
@override
public
void
desc()
}//裝飾器: 高人
class
highperson
extends
persondecorator
@override
public
void
desc()
}class
richperson
extends
persondecorator
@override
public
void
desc()
}class
prettyperson
extends
persondecorator
@override
public
void
desc()
}public
class
decorationpattern
}
類圖:
優點:
缺點:
設計模式(五) 裝飾模式
什麼是裝飾模式?裝飾模式 decorator 動態的給乙個物件增加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。一般而言,當系統需要實現新功能時候,我們會向舊的類中新增新的 以擴充套件其功能。我們將這種行為稱為對主類的裝飾,但這種做法的問題在於,在主類中增加了屬性和方法,從而增加了主類...
設計模式(五)裝飾模式
一 概念 特點 裝飾者和被裝飾者擁有相同的超型別 可能是抽象類也可能是介面 在裝飾類中包含乙個被裝飾元件類的物件引用 可以為被裝飾物件新增額外的功能 在裝飾類中重寫被裝飾元件類中的方法,並對被裝飾元件類中對應的方法呼叫 因為裝飾者和被裝飾者擁有相同的抽象型別,因此在任何需要原始物件 被包裝 的場合,...
(五)設計模式 裝飾模式
動態的給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。人 concretecomponet定義了乙個具體的物件,也可以給這個物件新增職責。服飾 裝飾抽象類,繼承componet,從外類來擴充套件componet類的功能,但對於componet來說,是無需知道decorato...