网库网(www.wangkuwang.com)精品网站源码,织梦建站模版,游戏源代码分享平台

模板户源码

当前位置:首页 -> CMS教程 -> 教程专栏 正文

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

时间:2019-03-18 07:55:59 [整站源码]作者:zhaopulei


任钢 架构设计模式

摘要:本文用一个实例场景描述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

 


    发送中

    本文标签:AutoTags插件服务端需要您提供购买者的账号和密码才能继续访问  折翼天使  莎莎源码  吾爱源码  其他源码 

    转载请注明来源:PHP手机端发卡多种支付商业版源码

    本文永久链接地址:https://www.suibianlu.com/11942.html

    郑重声明:
    本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
    若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
    如无法链接失效或侵犯版权,请给我们来信:admin@suibianlu.com

    栏目导航
    最新文章
    热门文章
    Top