首页 > 编程 > Python > 正文

简介Python设计模式中的代理模式与模板方法模式编程

2020-01-04 17:47:25
字体:
来源:转载
供稿:网友
这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下
 

代理模式
Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介

python的例子
你先设想:一个对象提供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()


模板方法模式
不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 如果说策略模式, 策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后使用委托的方式解决。 模板方法模式的角度是:把不变的框架抽象出来,定义好要传入的细节的接口. 各产品类的公共的行为 会被提出到公共父类,可变的都在这些产品子类中

python的例子

# 整个例子我们要根据不同需求处理的内容ingredients = "spam eggs apple"line = '-' * 10# 这是被模板方法调用的基础函数def iter_elements(getter, action):  """循环处理的骨架"""  # getter是要迭代的数据,action是要执行的函数  for element in getter():    action(element)    print(line)def rev_elements(getter, action):  """反向的"""  for element in getter()[::-1]:    action(element)    print(line)# 数据经过函数处理就是我们最后传给模板的内容def get_list():  return ingredients.split()# 同上def get_lists():  return [list(x) for x in ingredients.split()]# 对数据的操作def print_item(item):  print(item)#反向处理数据def reverse_item(item):  print(item[::-1])# 模板函数def make_template(skeleton, getter, action):  # 它抽象的传入了 骨架,数据,和子类的操作函数  def template():    skeleton(getter, action)  return template# 列表解析,数据就是前面的2种骨架(定义怎么样迭代),2个分割数据的函数,正反向打印数据的组合templates = [make_template(s, g, a)      for g in (get_list, get_lists)      for a in (print_item, reverse_item)      for s in (iter_elements, rev_elements)]# 执行for template in templates:  template()

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表