舉例講解Python設(shè)計模式編程的代理模式與抽象工廠模式
代理模式
Proxy模式是一種常用的設(shè)計模式,它主要用來通過一個對象(比如B)給一個對象(比如A) 提供'代理'的方式方式訪問。比如一個對象不方便直接引用,代理就在這個對象和訪問者之間做了中介
你先設(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é)果是不同的 有個'工廠'(抽象工廠里面一個類型就是一個工廠,這點和其他模式的不同)專門幫助我們找到對應(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()
相關(guān)文章
python入門學(xué)習(xí)關(guān)于for else的特殊特性講解
本文將介紹 Python 中的" for-else"特性,并通過簡單的示例說明如何正確使用它,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python的Twisted框架中使用Deferred對象來管理回調(diào)函數(shù)
當(dāng)說起Twisted的異步與非阻塞模式等特性時,回調(diào)函數(shù)的使用在其中自然就顯得不可或缺,接下來我們就來看Python的Twisted框架中使用Deferred對象來管理回調(diào)函數(shù)的用法.2016-05-05
關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事
這篇文章主要給大家介紹了關(guān)于Kotlin中SAM轉(zhuǎn)換的那些事,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù)
這篇文章主要介紹了Selenium+BeautifulSoup+json獲取Script標(biāo)簽內(nèi)的json數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
舉例詳解Python中的split()函數(shù)的使用方法
這篇文章主要介紹了舉例詳解Python中的split()函數(shù)的使用方法,split()函數(shù)的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,通常用于將字符串切片并轉(zhuǎn)換為列表,需要的朋友可以參考下2015-04-04

