舉例講解Python設(shè)計(jì)模式編程的代理模式與抽象工廠模式
代理模式
Proxy模式是一種常用的設(shè)計(jì)模式,它主要用來(lái)通過(guò)一個(gè)對(duì)象(比如B)給一個(gè)對(duì)象(比如A) 提供'代理'的方式方式訪問(wèn)。比如一個(gè)對(duì)象不方便直接引用,代理就在這個(gè)對(duì)象和訪問(wèn)者之間做了中介
你先設(shè)想:一個(gè)對(duì)象提供rgb三種顏色值,我想獲得一個(gè)對(duì)象的rgb三種顏色,但是我不想讓你獲得藍(lán)色屬性,怎么辦?
class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其實(shí)本質(zhì)上就是屬性的委托 def __getattr__(self, name): return getattr(self.__subject, name) class RGB: def __init__(self, red, green, blue): self.__red = red self.__green = green self.__blue = blue def Red(self): return self.__red def Green(self): return self.__green def Blue(self): return self.__blue class NoBlueProxy(Proxy): # 我在這個(gè)子代理類攔截了blue的訪問(wèn),這樣就不會(huì)返回被代理的類的Blue屬性 def Blue(self): return 0 if __name__ == '__main__': rgb = RGB(100, 192, 240) print rgb.Red() proxy = Proxy(rgb) print proxy.Green() noblue = NoBlueProxy(rgb) print noblue.Green() print noblue.Blue()
抽象工廠模式
和簡(jiǎn)單工廠/工廠方法不同,抽象工廠可能最好理解,舉個(gè)例子:
比如2個(gè)動(dòng)物,貓和狗,他們都有speak和eat的function,但是很明顯他們執(zhí)行的結(jié)果是不同的 有個(gè)'工廠'(抽象工廠里面一個(gè)類型就是一個(gè)工廠,這點(diǎn)和其他模式的不同)專門(mén)幫助我們找到對(duì)應(yīng)的動(dòng)物做正確的操作 有個(gè)類/函數(shù)可以通過(guò)參數(shù)幫助我們找到上面的這個(gè)工廠 這就是抽象工廠
from abc import ABCMeta class StandardFactory(object): '''這就是那個(gè)抽象工廠''' @staticmethod def get_factory(factory): '''根據(jù)參數(shù)找到對(duì)實(shí)際操作的工廠''' if factory == 'cat': return CatFactory() elif factory == 'dog': return DogFactory() raise TypeError('Unknown Factory.') 這里幫助dog這個(gè)產(chǎn)品類找到應(yīng)該的屬性的工廠 class DogFactory(object): def get_pet(self): return Dog(); class CatFactory(object): # 注意這個(gè)方法和上面的名字一樣,但是返回的類不同,這就是工廠的作用 def get_pet(self): return Cat(); # 可以認(rèn)為dog和cat都是動(dòng)物的一種,可以有個(gè)基類 class Pet(object): # ABCMeta會(huì)讓這個(gè)類在注冊(cè)后添加很多基礎(chǔ)抽象基類,可以看[ABCMeta](http://docs.python.org/2/library/abc.html#abc.ABCMeta) __metaclass__ = ABCMeta def eat(self): pass # Dog應(yīng)該做什么就是這里 class Dog(Pet): def eat(self): return 'Dog food...' class Cat(Pet): # 這里的eat依然是同名,她們都是同樣的操作,只是返回不同 def eat(self): return 'Cat food...' if __name__ =="__main__": factory = StandardFactory.get_factory('cat') pet = factory.get_pet() print pet.eat() # 注意這里,你只需要修改抽象工廠傳入的那個(gè)參數(shù),其他什么都不用改 factory = StandardFactory.get_factory('dog') pet = factory.get_pet() print pet.eat()
相關(guān)文章
python入門(mén)學(xué)習(xí)關(guān)于for else的特殊特性講解
本文將介紹 Python 中的" for-else"特性,并通過(guò)簡(jiǎn)單的示例說(shuō)明如何正確使用它,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11Python的Twisted框架中使用Deferred對(duì)象來(lái)管理回調(diào)函數(shù)
當(dāng)說(shuō)起Twisted的異步與非阻塞模式等特性時(shí),回調(diào)函數(shù)的使用在其中自然就顯得不可或缺,接下來(lái)我們就來(lái)看Python的Twisted框架中使用Deferred對(duì)象來(lái)管理回調(diào)函數(shù)的用法.2016-05-05關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事
這篇文章主要給大家介紹了關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù)
這篇文章主要介紹了Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12舉例詳解Python中的split()函數(shù)的使用方法
這篇文章主要介紹了舉例詳解Python中的split()函數(shù)的使用方法,split()函數(shù)的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),通常用于將字符串切片并轉(zhuǎn)換為列表,需要的朋友可以參考下2015-04-04使用Python+wxpy 找出微信里把你刪除的好友實(shí)例
今天小編就為大家分享一篇使用Python+wxpy 找出微信里把你刪除的好友實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02