有時(shí)候,我們想通過一個(gè)類來調(diào)用另一個(gè)類里的方法來處理請(qǐng)求,即這兩個(gè)類對(duì)象參與處理同一個(gè)請(qǐng)求對(duì)象,只不過一個(gè)是 委托者 ,一個(gè)是 處理者 。
比如我們現(xiàn)在有一個(gè)名為Dog的類對(duì)象,我們希望通過它調(diào)用 voice 類產(chǎn)生“狗吠 ” 聲,這時(shí)候就可以采用 委托模式 。下面就用Python來理解這個(gè)設(shè)計(jì)模式。
Python里,在委托者類對(duì)象中,需要這么設(shè)計(jì):
1. 重寫__getattr__方法,使得委托者獲得處理者的屬性。
2. 判斷該屬性是否為可調(diào)用函數(shù),如果不是則直接返回,如果是,則用 wrapper 封裝為可調(diào)用對(duì)象。
如下所示:
這樣做的好處是,處理者(被委托者)不需要做太多的更改,一般是一個(gè)公用類。我們的處理者如下:
這樣就可以通過委托者來調(diào)用另一個(gè)類的方法來對(duì)請(qǐng)求進(jìn)行處理:
if __name__ == '__main__':
John = Dog(voice())
John.words('汪汪')
實(shí)際上,如果你不重寫__getattr__,一樣可以用以下的方式調(diào)用到voice類:
if __name__ == '__main__':
John = Dog(voice())
John.voice.words('汪汪')
這兩種有什么區(qū)別?使用委托模式,可以簡(jiǎn)化代碼,優(yōu)化可讀性,你不需要再調(diào)用voice對(duì)象, 委托者自己會(huì)利用 getattr 找到相應(yīng)的對(duì)象里的方法。
不過,在Python里,委托模式這樣的寫法其實(shí)是 un-pythonic 的,因?yàn)樗鼘⒄{(diào)用的方法隱藏在了執(zhí)行者中, 可讀性比較差。如果不是特殊需要,我們一般不會(huì)這么做,這里只是給大家展示如何用Python來理解這個(gè)設(shè)計(jì)模式。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68525 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84628 -
Voice
+關(guān)注
關(guān)注
0文章
9瀏覽量
7227
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論