設計模式之五裝飾模式

2021-10-04 03:32:41 字數 2834 閱讀 9489

裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該盡量使用物件組合,而不是物件繼承來擴充套件和復用功能。裝飾器模式就是基於物件組合的方式,可以很靈活的給物件新增所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把複雜的功能簡單化,分散化,然後再執行期間,根據需要來動態組合的這樣乙個模式。

裝飾模式(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...