视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2020-11-27 14:35:09 责编:小采
文档


代理模式
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.__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,但是很明显他们执行的结果是不同的 有个'工厂'(抽象工厂里面一个类型就是一个工厂,这点和其他模式的不同)专门帮助我们找到对应的动物做正确的操作 有个类/函数可以通过参数帮助我们找到上面的这个工厂 这就是抽象工厂

from abc import ABCMeta

class 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()

下载本文
显示全文
专题