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

舉例講解Python設(shè)計(jì)模式編程的代理模式與抽象工廠模式

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

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

你先設(shè)想:一個對象提供rgb三種顏色值,我想獲得一個對象的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):
  # 我在這個子代理類攔截了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é)果是不同的 有個'工廠'(抽象工廠里面一個類型就是一個工廠,這點(diǎn)和其他模式的不同)專門幫助我們找到對應(yīng)的動物做正確的操作 有個類/函數(shù)可以通過參數(shù)幫助我們找到上面的這個工廠  這就是抽象工廠

from abc import ABCMeta

class StandardFactory(object):
  '''這就是那個抽象工廠'''
  @staticmethod
  def get_factory(factory):
    '''根據(jù)參數(shù)找到對實(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)文章

最新評論

聊城市| 淮安市| 裕民县| 壤塘县| 游戏| 连南| 塔城市| 综艺| 革吉县| 金山区| 印江| 阿拉善左旗| 都匀市| 赤城县| 曲水县| 郓城县| 美姑县| 丽江市| 讷河市| 吉水县| 大名县| 达孜县| 通化县| 龙州县| 高淳县| 淅川县| 罗田县| 沙洋县| 保靖县| 崇仁县| 翁源县| 祁连县| 阳原县| 彰武县| 台前县| 清丰县| 东乡| 莱阳市| 同江市| 江门市| 潜山县|