設計模式 結構型模式,裝飾器模式(5)

2021-09-08 20:10:48 字數 1675 閱讀 8547

無論何時我們想對乙個物件新增額外的功能,都有下面這些不同的可選方法。

 如果合理,可以直接將功能新增到物件所屬的類(例如,新增乙個新的方法)

 使用組合

 使用繼承

與繼承相比,通常應該優先選擇組合,因為繼承使得**更難復用,繼承關係是靜態的,並且應用於整個類以及這個類的所有例項(請參考[gof95,第31頁]和網頁[t.cn/rqrc8yo])。

設計模式為我們提供第四種可選方法,以支援動態地(執行時)擴充套件乙個物件的功能,這種方法就是修飾器。修飾器(decorator)模式能夠以透明的方式(不會影響其他物件)動態地將功能新增到乙個物件中(請參考[gof95,第196頁])。

在許多程式語言中,使用子類化(繼承)來實現修飾器模式(請參考[gof95,第198頁])。

在python中,我們可以(並且應該)使用內建的修飾器特性。乙個python修飾器就是對python語法的乙個特定改變,用於擴充套件乙個類、方法或函式的行為,而無需使用繼承。從實現的角度來說,

python修飾器是乙個可呼叫物件(函式、方法、類),接受乙個函式物件fin作為輸入,並返回另乙個函式物件 。這意味著可以將任何具有這些屬性的可呼叫物件當作乙個修飾器。在第1章和第2章中已經看到如何使用內建的property修飾器讓乙個方法表現為乙個變數。在5.4節,我們將學習如何實現及使用我們自己的修飾器。

修飾器模式和python修飾器之間並不是一對一的等價關係。python修飾器能做的實際上比修飾器模式多得多,其中之一就是實現修飾器模式

class

foo(object):

deff1(self):

print("

original f1")

deff2(self):

print("

original f2")

class

foo_decorator(object):

def__init__

(self, decoratee):

self._decoratee =decoratee

deff1(self):

print("

decorated f1")

self._decoratee.f1()

def__getattr__

(self, name):

return getattr(self._decoratee, name)

u =foo()

v =foo_decorator(u)

v.f1()

v.f2()

1、上面這個裝飾者模式,和普通認為的python裝飾器比有一些區別。這個是正兒八經的的支援任何物件導向語言的寫法。python還有獨有的@形式的裝飾器。

2、使用python特有的裝飾器寫法,舉乙個簡單例子:

用裝飾類改變呢f1的功能。

在py中用@裝飾器是

# coding=utf-8

def decorator(func):

def _inner(*args, **kwargs):

print '在前面加點東西'

func(*args, **kwargs)

print '在後面加點東西'

return _inner

@decorator

def f1(a):

print a

f1(5)

設計模式 結構型模式 裝飾模式

設計模式 結構型模式 裝飾模式 以成績單需要家長簽字為要求。成績單類圖 抽象成績單 public abstract class schoolreport 下面書寫四年級成績單 public class fouthgradeschoolreport extends schoolreport 家長簽名 ...

設計模式 結構型模式 裝飾模式

在不改變現有物件結構的情況下,動態地給該物件增加一些職責 即增加其額外功能 的模式,它屬於物件結構性模式。優點 缺點主要缺點是 會增加很多子類,過度使用會增加程式的複雜性。結構主要角色 類圖 實現inte ce component class concretecomponent implements...

結構型模式 裝飾器模式

為已有的物件新增新的功能 新增新的方法到物件所屬的類中 使用組合創造新的物件 使用繼承創造子類 組合 繼承 新增新方法 python中我們可以使用內建的裝飾器特性來實現對類,方法的擴充套件,而無需使用繼承。用裝飾器來實現程式中的橫切關注點 應用中通用的部件,可以在程式中被廣泛使用的 推薦使用func...