舉例講解Python設計模式編程的代理模式與抽象工廠模式
代理模式
Proxy模式是一種常用的設計模式,它主要用來通過一個對象(比如B)給一個對象(比如A) 提供'代理'的方式方式訪問。比如一個對象不方便直接引用,代理就在這個對象和訪問者之間做了中介
你先設想:一個對象提供rgb三種顏色值,我想獲得一個對象的rgb三種顏色,但是我不想讓你獲得藍色屬性,怎么辦?
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í)行的結果是不同的 有個'工廠'(抽象工廠里面一個類型就是一個工廠,這點和其他模式的不同)專門幫助我們找到對應的動物做正確的操作 有個類/函數(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)品類找到應該的屬性的工廠
class DogFactory(object):
def get_pet(self):
return Dog();
class CatFactory(object):
# 注意這個方法和上面的名字一樣,但是返回的類不同,這就是工廠的作用
def get_pet(self):
return Cat();
# 可以認為dog和cat都是動物的一種,可以有個基類
class Pet(object):
# ABCMeta會讓這個類在注冊后添加很多基礎抽象基類,可以看[ABCMeta](http://docs.python.org/2/library/abc.html#abc.ABCMeta)
__metaclass__ = ABCMeta
def eat(self):
pass
# Dog應該做什么就是這里
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()
相關文章
MySQL中表的復制以及大型數(shù)據(jù)表的備份教程
這篇文章主要介紹了MySQL中表的復制以及大型數(shù)據(jù)表的備份教程,其中大表備份是采用添加觸發(fā)器增量備份的方法,需要的朋友可以參考下2015-11-11
pandas中DataFrame.to_dict()的實現(xiàn)示例
本文主要介紹了pandas中DataFrame.to_dict()的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-08-08
Python實現(xiàn)批量填補遙感影像的無效值NoData
這篇文章主要為大家介紹了如何基于Python中ArcPy模塊,對大量柵格遙感影像文件批量進行無效值(NoData值)填充的方法,感興趣的小伙伴可以了解一下2023-06-06
Python基于正則表達式實現(xiàn)文件內(nèi)容替換的方法
這篇文章主要介紹了Python基于正則表達式實現(xiàn)文件內(nèi)容替換的方法,涉及Python文件、目錄及字符串正則替換等相關操作技巧,需要的朋友可以參考下2017-08-08
Python統(tǒng)計學一數(shù)據(jù)的概括性度量詳解
這篇文章主要介紹了Python統(tǒng)計學一數(shù)據(jù)的概括性度量詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python3爬蟲教程之利用Python實現(xiàn)發(fā)送天氣預報郵件
這篇文章主要給大家介紹了關于Python3爬蟲教程之利用Python實現(xiàn)發(fā)送天氣預報郵件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-12-12

