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

yipeiwu_com6年前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.__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()


模板方法模式
不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现, 如果说策略模式, 策略模式是将逻辑封装在一个类(提到的文章中的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()

相关文章

Python自动生成代码 使用tkinter图形化操作并生成代码框架

Python自动生成代码 使用tkinter图形化操作并生成代码框架

背景 在写代码过程中,如果有频繁重复性的编码操作,或者可以Reuse的各类代码,可以通过Python写一个脚本,自动生成这类代码,就不用每次手写、或者copy了。 比如新建固定的代码框架...

使用Python快速制作可视化报表的方法

使用Python快速制作可视化报表的方法

我们可以试用可视化包——Pyechart。 Echarts是百度开源的一个数据可视化JS库,主要用于数据可视化。 pyecharts是一个用于生成Echarts图标的类库。实际就是Ech...

在Python中操作文件之truncate()方法的使用教程

 truncate()方法截断该文件的大小。如果可选的尺寸参数存在,该文件被截断(最多)的大小。 大小默认为当前位置。当前文件位置不改变。注意,如果一个指定的大小超过了文件的当...

Python读取csv文件分隔符设置方法

Windows下的分隔符默认的是逗号,而MAC的分隔符是分号。拿到一份用分号分割的CSV文件,在Win下是无法正确读取的,因为CSV模块默认调用的是Excel的规则。 所以我们在读取文件...

深入分析python数据挖掘 Json结构分析

深入分析python数据挖掘 Json结构分析

json是一种轻量级的数据交换格式,也可以说是一种配置文件的格式 这种格式的文件是我们在数据处理经常会遇到的 python提供内置的模块json,只需要在使用前导入即可  ...