📄 templaterealworld.cs
字号:
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
//模版方法(Template Method pattern)
//意图
// 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
//适用性
// 1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
// 2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。
// 首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
// 3.控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
//例子
// CppUnit 中 TestCase 作为抽象类无法确定测试的具体行为,因此留待派生类解决(setup->runTest->tearDown 流程)
namespace DesignPattern.TemplateRealWorld
{
class TemplateRealWorld : AbstractPattern
{
public static void Run(TextBox tbInfo)
{
s_tbInfo = tbInfo;
s_tbInfo.Text = "";
DataAccessObject dao;
dao = new Categories();
dao.Run();
dao = new Products();
dao.Run();
// Wait for user
//Console.Read();
}
}
// "AbstractClass"
abstract class DataAccessObject
{
protected string connectionString;
protected DataSet dataSet;
public virtual void Connect()
{
// Make sure mdb is on c:\
connectionString = "provider=Microsoft.JET.OLEDB.4.0; " + "data source=c:\\nwind.mdb";
}
public abstract void Select();
public abstract void Process();
public virtual void Disconnect()
{
connectionString = "";
}
// The "Template Method"
public void Run()
{
Connect();
Select();
Process();
Disconnect();
}
}
// "ConcreteClass"
class Categories : DataAccessObject
{
public override void Select()
{
string sql = "select CategoryName from Categories";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Categories");
}
public override void Process()
{
DesignPattern.FormMain.OutputInfo("Categories ---- ");
DataTable dataTable = dataSet.Tables["Categories"];
foreach (DataRow row in dataTable.Rows)
{
DesignPattern.FormMain.OutputInfo(row["CategoryName"].ToString());
}
DesignPattern.FormMain.OutputInfo("");
}
}
class Products : DataAccessObject
{
public override void Select()
{
string sql = "select ProductName from Products";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);
dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Products");
}
public override void Process()
{
DesignPattern.FormMain.OutputInfo("Products ---- ");
DataTable dataTable = dataSet.Tables["Products"];
foreach (DataRow row in dataTable.Rows)
{
DesignPattern.FormMain.OutputInfo(row["ProductName"].ToString());
}
DesignPattern.FormMain.OutputInfo("");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -