模板方法模式(Template Method)
2012-08-10 09:56
106 查看
1. 定义
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. UML 类图
3. 结构代码
4. 实例代码
该文章来自:http://www.dofactory.com/Patterns/PatternTemplate.aspx
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2. UML 类图
3. 结构代码
// Template Method pattern -- Structural example |
using System; namespace DoFactory.GangOfFour.Template.Structural { ///<summary> /// MainApp startup class for Real-World /// Template Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { AbstractClass aA =new ConcreteClassA(); aA.TemplateMethod(); AbstractClass aB =new ConcreteClassB(); aB.TemplateMethod(); // Wait for user Console.ReadKey(); } } ///<summary> /// The 'AbstractClass' abstract class ///</summary> abstractclass AbstractClass { publicabstract void PrimitiveOperation1(); publicabstract void PrimitiveOperation2(); // The "Template method" publicvoid TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } } ///<summary> /// A 'ConcreteClass' class ///</summary> classConcreteClassA : AbstractClass { publicoverride void PrimitiveOperation1() { Console.WriteLine("ConcreteClassA.PrimitiveOperation1()"); } publicoverride void PrimitiveOperation2() { Console.WriteLine("ConcreteClassA.PrimitiveOperation2()"); } } ///<summary> /// A 'ConcreteClass' class ///</summary> classConcreteClassB : AbstractClass { publicoverride void PrimitiveOperation1() { Console.WriteLine("ConcreteClassB.PrimitiveOperation1()"); } publicoverride void PrimitiveOperation2() { Console.WriteLine("ConcreteClassB.PrimitiveOperation2()"); } } } |
Output ConcreteClassA.PrimitiveOperation1() ConcreteClassA.PrimitiveOperation2() |
// Template Method pattern -- Real World example |
using System; using System.Data; using System.Data.OleDb; namespace DoFactory.GangOfFour.Template.RealWorld { ///<summary> /// MainApp startup class for Real-World /// Template Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { DataAccessObject daoCategories =new Categories(); daoCategories.Run(); DataAccessObject daoProducts =new Products(); daoProducts.Run(); // Wait for user Console.ReadKey(); } } ///<summary> /// The 'AbstractClass' abstract class ///</summary> abstractclass DataAccessObject { protectedstring connectionString; protectedDataSet dataSet; publicvirtual void Connect() { // Make sure mdb is available to app connectionString = "provider=Microsoft.JET.OLEDB.4.0; " + "data source=..\\..\\..\\db1.mdb"; } publicabstract void Select(); publicabstract void Process(); publicvirtual void Disconnect() { connectionString = ""; } // The 'Template Method' publicvoid Run() { Connect(); Select(); Process(); Disconnect(); } } ///<summary> /// A 'ConcreteClass' class ///</summary> classCategories : DataAccessObject { publicoverride void Select() { string sql ="select CategoryName from Categories"; OleDbDataAdapter dataAdapter =new OleDbDataAdapter( sql, connectionString); dataSet = new DataSet(); dataAdapter.Fill(dataSet, "Categories"); } publicoverride void Process() { Console.WriteLine("Categories ---- "); DataTable dataTable = dataSet.Tables["Categories"]; foreach (DataRow rowin dataTable.Rows) { Console.WriteLine(row["CategoryName"]); } Console.WriteLine(); } } ///<summary> /// A 'ConcreteClass' class ///</summary> classProducts : DataAccessObject { publicoverride void Select() { string sql ="select ProductName from Products"; OleDbDataAdapter dataAdapter =new OleDbDataAdapter( sql, connectionString); dataSet = new DataSet(); dataAdapter.Fill(dataSet, "Products"); } publicoverride void Process() { Console.WriteLine("Products ---- "); DataTable dataTable = dataSet.Tables["Products"]; foreach (DataRow rowin dataTable.Rows) { Console.WriteLine(row["ProductName"]); } Console.WriteLine(); } } } |
Output Categories ---- Beverages Condiments Confections Dairy Products Grains/Cereals Meat/Poultry Produce Seafood Products ---- Chai Chang Aniseed Syrup Chef Anton's Cajun Seasoning Chef Anton's Gumbo Mix Grandma's Boysenberry Spread Uncle Bob's Organic Dried Pears Northwoods Cranberry Sauce Mishi Kobe Niku |
相关文章推荐
- Java设计模式—模板方法(Template Method)
- 行为模式: Template Method(模板方法)
- 行为型模式-模板方法模式(Template Method)
- 模板方法模式(Template Method)
- java模板方法设计模式(Template Method)
- 23种设计模式之模板方法(Template Method)
- Java设计模式之一——模板方法设计模式(Template Method)
- C++设计模式编程中Template Method模板方法模式的运用
- 模板方法模式 template method
- 设计模式之模板方法模式(Template Method)
- C#设计模式(14)——模板方法模式(Template Method)
- 14. Template Method模板方法(行为型模式)
- JAVA设计模式(17):行为型-模板方法模式(Template Method)
- 设计模式(12)-模板方法模式(Template Method)
- Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)
- 设计模式(11)——模板方法模式(Template Method Pattern,行为型)
- 设计模式(22)——模板方法 Template Method
- 设计模式之:模板方法模式(Template Method)
- 模板方法模式(Template Method Pattern)
- 设计模式之模板方法模式(Template Method)