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

首頁 > 編程 > Python > 正文

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

2019-11-25 16:59:02
字體:
來源:轉載
供稿:網友

代理模式
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()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 胶州市| 阆中市| 集安市| 青神县| 碌曲县| 新邵县| 资兴市| 马关县| 梧州市| 左云县| 郸城县| 淮阳县| 洮南市| 博兴县| 桓台县| 柳林县| 福海县| 若尔盖县| 鄂尔多斯市| 辽阳市| 宁蒗| 饶平县| 准格尔旗| 梁河县| 临泉县| 西吉县| 杭锦后旗| 南和县| 五寨县| 南陵县| 淮安市| 南漳县| 九龙县| 治多县| 屏山县| 鹿泉市| 晋江市| 册亨县| 沁水县| 利川市| 大冶市|