模板模式(TemplatePattern)定义在一个操作中定义一个算法的骨架,将一些步骤推迟到子类。模板方法让子类重新定义一个算法的某些步骤而不改变算法的结构.(在一个运算中定义一个算法的框架,把一些步骤推迟到子类。这样子类就可以在不改变一个算法的结构的情况下,重新定义算法的一些具体步骤。《设计模式之禅》模板模式最重要的目的是简化代码冗余和模板相同的执行过程。UML示例@startumlAbstractQueryTemplateclassNewVehiclesQueryclassUserGrossQueryQueryTemplate<|--NewVehiclesQueryQueryTemplate<|--UserGrossQuery@enduml模板模式是允许父类或基类实现功能的代码流,并让子类实现差异内容;以上UML是描述模板pa的例子ttern,详见代码。引自《python3》面对象编程代码现实#创建数据库基础信息importsqlite3conn=sqlite3.connect('sales.db')conn.execute("CREATETABLESales(salespersontext,amtcurrency,yearinteger,modeltext,newboolean)")conn.execute("INSERTINTOSalesvalues('Tim',16000,2010,'HondaFit','true')")"conn.execute("INSERTINTOSalesvalues('Tim',9000,2006,'FordFocus','false')")conn.execute("INSERTINTOSalesvalues('Gayle',8000,2004,'DodgeNeon','false')")conn.execute("插入销售值('Gayle',28000,2009,'FordMustang','true')")conn.execute("INSERTINTOSalesvalues('Gayle',50000,2010,'LincolnNavigator','true')")conn.execute("INSERTINTOSalesvalues('Don',20000,2008,'ToyotaPrius','false')")conn.commit()conn.close()#模板模型举例importdatetimeimportsqlite3classQueryTemplate:defconnect(self):self.conn=sqlite3.connect("sales.db")defconstruct_query(self):raiseNotImplementedError()defdo_query(self):结果=self.conn.execute(self.query)self.results=results.fetchall()defformat_results(self):output=[]forrowinself.results:row=[str(i)foriinrow]output.append(",".join(row))self.formatted_results="\n".join(output)defoutput_results(self):raiseNotImplementedError()#作为模板代码,公共部分defprocess_format(self):self.connect()self.construct_query()self.do_query()self.format_results()self.output_results()classNewVehicleQuery(QueryTemplate):defconstruct_query(self):self.query="select*fromSaleswherenew='true'"定义输出结果(self):print(self.format_results)classUserGrossQuery(QueryTemplate):defconstruct_query(self):self.query="selectsalesperson,sum(amt)fromSalesgroupbysalesperson"defoutput_results(self):文件名="gross_sales_{0}".format(datetime.date.today().strftime("%Y%m%d"))withopen(filename,'w')asoutfile:outfile.write(self.formatted_results)if__name__=="__main__":query1=NewVehicleQuery()query1.process_format()query2=UserGrossQuery()query2.process_format()知识点模板模式比较简单,主要用于让父类实现公共逻辑部分,子类实现差异化代码。在python中,如果想让子类实现某个方法,可以使用raiseNotImplementedError()如果子类没有实现,会调用父类的方法并抛出异常,如果使用pass则不会报错,导致问题被掩盖,无法定位。sqlite3是python自带的一个标准库,可以作为demo实现,如果想自定义差异化流程,可以在父类中实现一个方法来设置改变流程的变量,使用这个变量来控制分支进程。通过实现该方法并灵活赋值,子类可以更改模板流程processnextsetpreviewprototypemode
