国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

舉例講解Python設計模式編程的代理模式與抽象工廠模式

2020-01-04 17:50:46
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python編程的代理模式與抽象工廠模式,文中舉了兩個簡單的小例子來說明這兩種設計模式的思路在Python編程中的體現,需要的朋友可以參考下
 

代理模式
Proxy模式是一種常用的設計模式,它主要用來通過一個對象(比如B)給一個對象(比如A) 提供'代理'的方式方式訪問。比如一個對象不方便直接引用,代理就在這個對象和訪問者之間做了中介

你先設想:一個對象提供rgb三種顏色值,我想獲得一個對象的rgb三種顏色,但是我不想讓你獲得藍色屬性,怎么辦?

class Proxy(object):  def __init__(self, subject):    self.__subject = subject  # 代理其實本質上就是屬性的委托  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.__blueclass NoBlueProxy(Proxy):  # 我在這個子代理類攔截了blue的訪問,這樣就不會返回被代理的類的Blue屬性  def Blue(self):    return 0if __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,但是很明顯他們執行的結果是不同的 有個'工廠'(抽象工廠里面一個類型就是一個工廠,這點和其他模式的不同)專門幫助我們找到對應的動物做正確的操作 有個類/函數可以通過參數幫助我們找到上面的這個工廠  這就是抽象工廠

from abc import ABCMetaclass StandardFactory(object):  '''這就是那個抽象工廠'''  @staticmethod  def get_factory(factory):    '''根據參數找到對實際操作的工廠'''    if factory == 'cat':      return CatFactory()    elif factory == 'dog':      return DogFactory()    raise TypeError('Unknown Factory.')這里幫助dog這個產品類找到應該的屬性的工廠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()  # 注意這里,你只需要修改抽象工廠傳入的那個參數,其他什么都不用改  factory = StandardFactory.get_factory('dog')  pet = factory.get_pet()  print pet.eat()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和林格尔县| 黎城县| 辉县市| 云浮市| 平凉市| 贞丰县| 江川县| 宁国市| 北流市| 浠水县| 渑池县| 邓州市| 孝感市| 正宁县| 河东区| 余江县| 堆龙德庆县| 安陆市| 祥云县| 喀喇| 郓城县| 家居| 顺昌县| 盐源县| 项城市| 临沧市| 南岸区| 沁水县| 陇南市| 孝感市| 洪江市| 宜丰县| 清流县| 榆林市| 安吉县| 饶平县| 平塘县| 贵南县| 永仁县| 天门市| 宁远县|