简介Python设计模式中的代理模式与模板方法模式编程
代理模式
Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A)提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介
python的例子
你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办?
classProxy(object): def__init__(self,subject): self.__subject=subject #代理其实本质上就是属性的委托 def__getattr__(self,name): returngetattr(self.__subject,name) classRGB: def__init__(self,red,green,blue): self.__red=red self.__green=green self.__blue=blue defRed(self): returnself.__red defGreen(self): returnself.__green defBlue(self): returnself.__blue classNoBlueProxy(Proxy): #我在这个子代理类拦截了blue的访问,这样就不会返回被代理的类的Blue属性 defBlue(self): return0 if__name__=='__main__': rgb=RGB(100,192,240) printrgb.Red() proxy=Proxy(rgb) printproxy.Green() noblue=NoBlueProxy(rgb) printnoblue.Green() printnoblue.Blue()
模板方法模式
不知道你有没有注意过,我们实现某个业务功能,在不同的对象会有不同的细节实现,如果说策略模式,策略模式是将逻辑封装在一个类(提到的文章中的Duck)中,然后使用委托的方式解决。模板方法模式的角度是:把不变的框架抽象出来,定义好要传入的细节的接口.各产品类的公共的行为会被提出到公共父类,可变的都在这些产品子类中
python的例子
#整个例子我们要根据不同需求处理的内容 ingredients="spameggsapple" line='-'*10 #这是被模板方法调用的基础函数 defiter_elements(getter,action): """循环处理的骨架""" #getter是要迭代的数据,action是要执行的函数 forelementingetter(): action(element) print(line) defrev_elements(getter,action): """反向的""" forelementingetter()[::-1]: action(element) print(line) #数据经过函数处理就是我们最后传给模板的内容 defget_list(): returningredients.split() #同上 defget_lists(): return[list(x)forxiningredients.split()] #对数据的操作 defprint_item(item): print(item) #反向处理数据 defreverse_item(item): print(item[::-1]) #模板函数 defmake_template(skeleton,getter,action): #它抽象的传入了骨架,数据,和子类的操作函数 deftemplate(): skeleton(getter,action) returntemplate #列表解析,数据就是前面的2种骨架(定义怎么样迭代),2个分割数据的函数,正反向打印数据的组合 templates=[make_template(s,g,a) forgin(get_list,get_lists) forain(print_item,reverse_item) forsin(iter_elements,rev_elements)] #执行 fortemplateintemplates: template()