Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.(定義一個操做中的算法的框架,而將一些步驟延遲到子類中。使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
《設計模式之禪》
模板模式最主要的目的就是簡化代碼冗餘,將相同的執行流程,模板化。
@startuml Abstract QueryTemplate class NewVehiclesQuery class UserGrossQuery QueryTemplate <|-- NewVehiclesQuery QueryTemplate <|-- UserGrossQuery @enduml
模板模式就是讓父類或者基類實現功能的代碼流程,而讓子類去實現差別內容;上述 UML 是描述模板模式的一個例子,具體看代碼吧。python
引自《python3》面向對象編程
# 建立數據庫基礎信息 import sqlite3 conn = sqlite3.connect('sales.db') conn.execute("CREATE TABLE Sales (salesperson text, amt currency, year integer, model text, new boolean)") conn.execute("INSERT INTO Sales values ('Tim', 16000, 2010, 'Honda Fit', 'true')") conn.execute("INSERT INTO Sales values ('Tim', 9000, 2006, 'Ford Focus', 'false')") conn.execute("INSERT INTO Sales values ('Gayle', 8000, 2004, 'Dodge Neon', 'false')") conn.execute("INSERT INTO Sales values ('Gayle', 28000, 2009, 'Ford Mustang', 'true')") conn.execute("INSERT INTO Sales values ('Gayle', 50000, 2010, 'Lincoln Navigator', 'true')") conn.execute("INSERT INTO Sales values ('Don', 20000, 2008, 'Toyota Prius', 'false')") conn.commit() conn.close()
# 模板模式舉例 import datetime import sqlite3 class QueryTemplate: def connect(self): self.conn = sqlite3.connect("sales.db") def construct_query(self): raise NotImplementedError() def do_query(self): results = self.conn.execute(self.query) self.results = results.fetchall() def format_results(self): output = [] for row in self.results: row = [str(i) for i in row] output.append(", ".join(row)) self.formatted_results = "\n".join(output) def output_results(self): raise NotImplementedError() # 做爲模板代碼,公共部分 def process_format(self): self.connect() self.construct_query() self.do_query() self.format_results() self.output_results() class NewVehicleQuery(QueryTemplate): def construct_query(self): self.query = "select * from Sales where new='true'" def output_results(self): print(self.format_results) class UserGrossQuery(QueryTemplate): def construct_query(self): self.query = "select salesperson, sum(amt) from Sales group by salesperson" def output_results(self): filename = "gross_sales_{0}".format(datetime.date.today().strftime("%Y%m%d")) with open(filename, 'w') as outfile: outfile.write(self.formatted_results) if __name__ == "__main__": query1 = NewVehicleQuery() query1.process_format() query2 = UserGrossQuery() query2.process_format()