舉例講解Python設(shè)計(jì)模式編程的代理模式與抽象工廠模式
代理模式
Proxy模式是一種常用的設(shè)計(jì)模式,它主要用來通過一個(gè)對(duì)象(比如B)給一個(gè)對(duì)象(比如A) 提供'代理'的方式方式訪問。比如一個(gè)對(duì)象不方便直接引用,代理就在這個(gè)對(duì)象和訪問者之間做了中介
你先設(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的訪問,這樣就不會(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()
抽象工廠模式
和簡單工廠/工廠方法不同,抽象工廠可能最好理解,舉個(gè)例子:
比如2個(gè)動(dòng)物,貓和狗,他們都有speak和eat的function,但是很明顯他們執(zhí)行的結(jié)果是不同的 有個(gè)'工廠'(抽象工廠里面一個(gè)類型就是一個(gè)工廠,這點(diǎn)和其他模式的不同)專門幫助我們找到對(duì)應(yīng)的動(dòng)物做正確的操作 有個(gè)類/函數(shù)可以通過參數(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)文章
MySQL中表的復(fù)制以及大型數(shù)據(jù)表的備份教程
這篇文章主要介紹了MySQL中表的復(fù)制以及大型數(shù)據(jù)表的備份教程,其中大表備份是采用添加觸發(fā)器增量備份的方法,需要的朋友可以參考下2015-11-11
pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例
本文主要介紹了pandas中DataFrame.to_dict()的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Python實(shí)現(xiàn)批量填補(bǔ)遙感影像的無效值NoData
這篇文章主要為大家介紹了如何基于Python中ArcPy模塊,對(duì)大量柵格遙感影像文件批量進(jìn)行無效值(NoData值)填充的方法,感興趣的小伙伴可以了解一下2023-06-06
Python基于正則表達(dá)式實(shí)現(xiàn)文件內(nèi)容替換的方法
這篇文章主要介紹了Python基于正則表達(dá)式實(shí)現(xiàn)文件內(nèi)容替換的方法,涉及Python文件、目錄及字符串正則替換等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Django實(shí)現(xiàn)快速分頁的方法實(shí)例
分頁是我們?nèi)粘i_發(fā)中必不可少的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Django如何實(shí)現(xiàn)快速分頁的方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
Python統(tǒng)計(jì)學(xué)一數(shù)據(jù)的概括性度量詳解
這篇文章主要介紹了Python統(tǒng)計(jì)學(xué)一數(shù)據(jù)的概括性度量詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python3爬蟲教程之利用Python實(shí)現(xiàn)發(fā)送天氣預(yù)報(bào)郵件
這篇文章主要給大家介紹了關(guān)于Python3爬蟲教程之利用Python實(shí)現(xiàn)發(fā)送天氣預(yù)報(bào)郵件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-12-12

