14-模板(Template Method)模式Python实现

2019-01-21 08:40:08 织梦安装使用
  • 文章介绍
任钢 架构设计模式

摘要:本文用一个实例场景描述Gof 23设计模式中的模板方法模式,并用Python程序代码给予实现,同时也给出实现代码的UML模型。

关键字Gof 23 设计模式 模板模式 Python

Template Method Patternbased on Python

REN gang

Abstract:This paper gives a scene example to describe theuse of Template Method Pattern,of Gof 23 Design Pattern, and achieves theexample by Python, at the same time, gives the UML model of realization of theexample.

Key word: Gof 23; DesignPattern; Template Method Pattern Python

 

1. 标准定义

模板方法(Template Method)模式标准定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2. 分析和说明

模板方法(Template Method)模式属于行为型设计模式。模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。也即是先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。模板方法(Template Method)模式结构如图1所示,其角色包括抽象模版(AbstractClass)角色和具体模版(ConcreteClass)角色。


1 模板方法模式结构

抽象模版(Abstract Class)角色有如下的责任:定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

具体模版(Concrete Class)角色有如下的责任:实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。

每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

2 应用场景举例

比如公司研发项目的过程是可行性研究、需求分析、总体设计、详细设计、系统编码、系统测试、系统部署、系统维护等标准过程。这些可以形成一个接口,但是为了简化工作,可以形成一个抽象的模板类。把这些步骤全部都实现,如果不能实现,那就使用抽象方法。现在有某给具体项目,其中的总体设计和详细设计与模板不同,这就可以采用模板方法模式。

在这里可以把ProjectProcessTemplate抽象类理解为抽象模版(Abstract Class)角色。ProjectA类和 ProjectB类是具体模版(Concrete Class)角色。其结构类图如图2所示。ProjectA类和 ProjectB类都继承ProjectProcessTemplate抽象类并实现ProjectProcess接口。


2 模板方法模式类图

 

3Python的实现程序代码

Python程序实现主要包括ProjectProcess接口,ProjectProcessTemplate抽象类,ProjectA类和ProjectB类等4个类。其关系如图2所示。下面分别列出这4个类的程序代码,最后列出测试代码并显示输出结果。

程序代码清单

 

class ProjectProcess:

 

     # 可行性分析过程

     def feasibilityProcess(content):

         raise NotImplementError("ProjectProcess")

     

     # 技术交流过程

     def technicalDiscussionProcess(content):

         raise NotImplementError("ProjectProcess")

      

     # 投标过程

     def bidProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 需求调研和分析过程

     def requirementProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 设计过程

     def designProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 编码过程

     def programProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 测试过程

     def testProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 部署和实施过程

     def deploymentProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 维护过程

     def maintenanceProcess(content):

         raise NotImplementError("ProjectProcess")

 

     # 具体工作

     def doActualWork(self):

         raise NotImplementError("ProjectProcess")

 

     # 展示内容

     def showProcess():

         raise NotImplementError("ProjectProcess")

 

 

class ProjectProcessTemplate():  

 

     def __init__ (self):

         self.processMap = {}

 

    # 可行性分析过程

     def feasibilityProcess(self,content):

         self.processMap["feasibilityProcess"] = content

     

     # 技术交流过程

     def technicalDiscussionProcess(self,content):

         self.processMap["technicalDiscussionProcess"] = content

      

     # 投标过程

     def bidProcess(self,content):

         self.processMap["bidProcess"] = content

 

     # 需求调研和分析过程

     def requirementProcess(self,content):

         self.processMap["requirementProcess"] = content

 

     # 设计过程

     def designProcess(self,content):

         self.processMap["designProcess"] = content

 

     # 编码过程

     def programProcess(self,content):

         self.processMap["programProcess"] = content

 

     # 测试过程

     def testProcess(self,content):

        self.processMap["testProcess"] = content

 

     # 部署和实施过程

    def deploymentProcess(self,content):

         self.processMap["deploymentProcess"] = content

 

     # 维护过程

     def maintenanceProcess(self,content):

         self.processMap["maintenanceProcess"] = content  

 

     # 展示内容

     def showProcess(self):

         # for process in ProjectProcessTemplate.processMap:

         for (key,content) in self.processMap.items():

            print ("主键是:" + key + ",对应的内容是:" + str(content))

 

           

class  ProjectA(ProjectProcessTemplate,ProjectProcess):

     

     # 具体工作

     def doActualWork(self):

         self.feasibilityProcess("定制可行性研究")

         self.technicalDiscussionProcess("定制技术交流")

         self.bidProcess("定制投标")

         self.requirementProcess("定制需求")

         self.designProcess("定制设计")

         self.programProcess("定制编码")

         self.testProcess("定制测试")

         self.deploymentProcess("定制部署")

         self.maintenanceProcess("定制维护") 

 

 

class ProjectB(ProjectProcessTemplate):

     

     # 具体工作

     def doActualWork(self):

         self.requirementProcess("定制需求")

         self.designProcess("定制设计")

         self.programProcess("定制编码")

         self.testProcess("定制测试")

         self.deploymentProcess("定制部署")

         self.maintenanceProcess("定制维护")

         

 

def main():

     print("———这是template的输出开始———")

 

     print("———projectA的过程———")

     project1 = ProjectA()

     project1.doActualWork()

     project1.showProcess()

 

     print("———projectB的过程———")

     project2 = ProjectB()

     project2.doActualWork()

     project2.showProcess()     

 

     print("———这是template的输出结束———");

 

if __name__ == '__main__':

     main()

 

模板方法模式测试类输出结果如下所示:

 

———这是template的输出开始———

———projectA的过程———

主键是:feasibilityProcess,对应的内容是:定制可行性研究

主键是:deploymentProcess,对应的内容是:定制部署

主键是:designProcess,对应的内容是:定制设计

主键是:requirementProcess,对应的内容是:定制需求

主键是:technicalDiscussionProcess,对应的内容是:定制技术交流

主键是:bidProcess,对应的内容是:定制投标

主键是:programProcess,对应的内容是:定制编码

主键是:maintenanceProcess,对应的内容是:定制维护

主键是:testProcess,对应的内容是:定制测试

———projectB的过程———

主键是:testProcess,对应的内容是:定制测试

主键是:deploymentProcess,对应的内容是:定制部署

主键是:designProcess,对应的内容是:定制设计

主键是:requirementProcess,对应的内容是:定制需求

主键是:programProcess,对应的内容是:定制编码

主键是:maintenanceProcess,对应的内容是:定制维护

———这是template的输出结束———

 

 

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.20009

[3] [] Alan Gauld 著,刘彩虹 张光庭 译,用Python学编程,北京:清华大学出版社.20029

[4] [] Magnus Lie Hetland 著, 译,Python基础教程(第2版),北京:人民邮电出版社.2010

[5] [] Mark Summerfield 著,王弘博,孙传庆 译,Python 3程序开发指南,北京:人民邮电出版社.20112

 


    发送中

    上一篇:html5点击按钮酷炫云雾动画弹出文字..

    下一篇:没有了

    相关文档推荐

    精品模板推荐

    专业的织梦模板定制下载站,在线购买后即可下载!

    商业源码

    跟版网模板,累计帮助5000+客户企业成功建站,为草根创业提供助力!

    立刻开启你的建站之旅
    
    QQ在线客服

    服务热线

    织梦建站咨询