python设计模式之模板方法

来源:互联网 发布:自动化控制软件 编辑:程序博客网 时间:2024/06/15 05:43

python设计模式之模板方法

意图

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

角色

  • 抽象类(AbstractClass),实现了模板方法,定义了算法的骨架
  • 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法

优点

  • 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
  • 子类实现算法的某些细节,有助于算法的扩展
  • 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”

缺点

  • 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象

适用性

  • 在某些类的算法中,用了相同的方法,造成代码的重复。
  • 控制子类扩展,子类必须遵守算法规则。

例子

  • 案例1
# -*- coding=utf-8 -*-class Template(object):    def logic(self):        print 'do something before ....'        print self.do_something_now()        print 'do something after ....'    def do_something_now(self):        return Noneclass ApplyTemplate1(Template):    def do_something_now(self):        return 'apply 1'class ApplyTemplate2(Template):    def __init__(self):        pass    def do_something_now(self):        return 'apply 2'if '__main__' == __name__:    obj1 = ApplyTemplate1()    obj2 = ApplyTemplate2()    obj1.logic()    obj2.logic()    print obj1.__class__    print obj2.__class__# outputdo something before ....apply 1do something after ....do something before ....apply 2do something after ....<class '__main__.ApplyTemplate1'><class '__main__.ApplyTemplate2'>
  • 例2,使用函数实现模板方法
# -*- coding=utf-8 -*-ingredients = "abc def ghi"line = '-' * 10# Skeletonsdef iter_elements(getter, action):    """Template skeleton that iterates items"""    for element in getter():        action(element)        print(line)def rev_elements(getter, action):    """Template skeleton that iterates items in reverse order"""    for element in getter()[::-1]:        action(element)        print(line)# Gettersdef get_list():    return ingredients.split()# Actionsdef print_item(item):    print(item)def make_template(skeleton, getter, action):    """    :param skeleton:  根据规则执行action和数据getter    :param getter:  需要传入的action方法的参数    :param action: 执行方法    :return: 返回template    """    def template():        skeleton(getter, action)    return templateif __name__ == '__main__':    # Create our template functions    templates = [make_template(s, g, a)                 for g in (get_list,)  # 数据                 for a in (print_item,)  # 动作                 for s in (iter_elements, rev_elements)]  # 调用    # Execute them    print templates    for template in templates:        template()output:[<function template at 0x00000000026776D8>, <function template at 0x0000000002677908>]abc----------def----------ghi----------ghi----------def----------abc----------
原创粉丝点击