你先設(shè)想:一個對象提供rgb三種顏色值,我想獲得一個對象的rgb三種顏色,但是我不想讓你獲得藍(lán)色屬性,怎么辦?
class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其實本質(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): # 我在這個子代理類攔截了blue的訪問,這樣就不會返回被代理的類的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()
抽象工廠模式
和簡單工廠/工廠方法不同,抽象工廠可能最好理解,舉個例子:
比如2個動物,貓和狗,他們都有speak和eat的function,但是很明顯他們執(zhí)行的結(jié)果是不同的 有個'工廠'(抽象工廠里面一個類型就是一個工廠,這點(diǎn)和其他模式的不同)專門幫助我們找到對應(yīng)的動物做正確的操作 有個類/函數(shù)可以通過參數(shù)幫助我們找到上面的這個工廠 這就是抽象工廠
from abc import ABCMeta class StandardFactory(object): '''這就是那個抽象工廠''' @staticmethod def get_factory(factory): '''根據(jù)參數(shù)找到對實際操作的工廠''' if factory == 'cat': return CatFactory() elif factory == 'dog': return DogFactory() raise TypeError('Unknown Factory.') 這里幫助dog這個產(chǎn)品類找到應(yīng)該的屬性的工廠 class DogFactory(object): def get_pet(self): return Dog(); class CatFactory(object): # 注意這個方法和上面的名字一樣,但是返回的類不同,這就是工廠的作用 def get_pet(self): return Cat(); # 可以認(rèn)為dog和cat都是動物的一種,可以有個基類 class Pet(object): # ABCMeta會讓這個類在注冊后添加很多基礎(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() # 注意這里,你只需要修改抽象工廠傳入的那個參數(shù),其他什么都不用改 factory = StandardFactory.get_factory('dog') pet = factory.get_pet() print pet.eat()
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com