最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年01月16日 09:48:45   作者:dongweiming  
這篇文章主要介紹了Python編程的代理模式與抽象工廠模式,文中舉了兩個簡單的小例子來說明這兩種設計模式的思路在Python編程中的體現(xiàn),需要的朋友可以參考下

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

相關文章

最新評論

偏关县| 增城市| 城口县| 中卫市| 平谷区| 阿勒泰市| 邢台县| 兴国县| 浦北县| 维西| 临安市| 容城县| 西青区| 大洼县| 丰宁| 竹北市| 南陵县| 射阳县| 江城| 永修县| 大足县| 封开县| 邮箱| 宁海县| 扬中市| 敦化市| 白河县| 南雄市| 峨眉山市| 嘉黎县| 岳普湖县| 凌云县| 崇义县| 琼结县| 乳山市| 高清| 广元市| 铁岭市| 兴宁市| 资源县| 河津市|