有時候,我們想通過一個類來調用另一個類里的方法來處理請求,即這兩個類對象參與處理同一個請求對象,只不過一個是 委托者 ,一個是 處理者 。
比如我們現在有一個名為Dog的類對象,我們希望通過它調用 voice 類產生“狗吠 ” 聲,這時候就可以采用 委托模式 。下面就用Python來理解這個設計模式。
Python里,在委托者類對象中,需要這么設計:
1. 重寫__getattr__方法,使得委托者獲得處理者的屬性。
2. 判斷該屬性是否為可調用函數,如果不是則直接返回,如果是,則用 wrapper 封裝為可調用對象。
如下所示:
這樣做的好處是,處理者(被委托者)不需要做太多的更改,一般是一個公用類。我們的處理者如下:
這樣就可以通過委托者來調用另一個類的方法來對請求進行處理:
if __name__ == '__main__':
John = Dog(voice())
John.words('汪汪')
實際上,如果你不重寫__getattr__,一樣可以用以下的方式調用到voice類:
if __name__ == '__main__':
John = Dog(voice())
John.voice.words('汪汪')
這兩種有什么區別?使用委托模式,可以簡化代碼,優化可讀性,你不需要再調用voice對象, 委托者自己會利用 getattr 找到相應的對象里的方法。
不過,在Python里,委托模式這樣的寫法其實是 un-pythonic 的,因為它將調用的方法隱藏在了執行者中, 可讀性比較差。如果不是特殊需要,我們一般不會這么做,這里只是給大家展示如何用Python來理解這個設計模式。
-
函數
+關注
關注
3文章
4306瀏覽量
62431 -
代碼
+關注
關注
30文章
4748瀏覽量
68356 -
python
+關注
關注
56文章
4782瀏覽量
84453 -
Voice
+關注
關注
0文章
9瀏覽量
7223
發布評論請先 登錄
相關推薦
評論