C#设计模式-窗体基类模板方法定义
C#设计模式-窗体基类模板方法定义
模板方法模式(Template Method Pattern)
模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。
a.模版方法
一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
这个模版方法一般会在抽象类中定义,并由子类不加以修改地完全继承下来。
b.基本方法
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和
钩子方法(Hook Method)。
关键字标示出来。
具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。在C#语言里面,一个具体方法
没有abstract关键字。
钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,
作为方法的默认实现。(Visual FoxPro中项目向导建立的项目会使用一个AppHook类实现监视项目成员变化,调整系统结构的工作。)钩子方法的名字通常以do开始。
下面讲解窗体基类的模板方法实现:
抽象方法必须定义在抽象类中(Abstract Class),在某些场合不一定使用抽象类,比如frmBase是个具体类,因此我将模板方法改为虚拟(Virtual)的。
/// <summary>
/// 在基类定义查询数据的模板方法,由派生窗体实现具体的查询功能。
/// </summary>
/// <returns></returns>
protected virtual DataTable DoSearch()
{
return new DataTable(); //模板方法不能返回实际数据。
}
派生类具体实现:
//复写(Override)模板方法,具体实现
protected override DataTable DoSearch()
{
return new BLL_Product().Search(txtProductCode.Text, txtProductName.Text);
}
窗体基类界面:

{
public frmBase()
{
InitializeComponent();
}
private void btnSearch_Click(object sender, EventArgs e)
{
//调用模板方法
DataTable data = this.DoSearch();
if (data.Rows.Count > 0)
this.dataGridView1.DataSource = data;
else
MessageBox.Show("没有找到数据!");
}
/// <summary>
/// 在基类定义查询数据的模板方法,由派生窗体实现具体的查询功能。
/// </summary>
/// <returns></returns>
protected virtual DataTable DoSearch()
{
return new DataTable(); //模板方法不能返回实际数据。
}
}
派生一个产品定义窗体:

{
public frmProduct()
{
InitializeComponent();
}
//复写(Override)模块方法,具体实现
protected override DataTable DoSearch()
{
return new BLL_Product().Search(txtProductCode.Text, txtProductName.Text);
}
}
搜索功能在窗体基类实现了,我们只需要定义具体的数据查找方法。
通过重写DoSearch模块方法,从业务逻辑层返回数据。
/// <summary>
/// 业务逻辑层
/// </summary>
public class BLL_Product
{
public DataTable Search(string productCode, string productName)
{
string where = " 1=1 ";
if (!String.IsNullOrEmpty(productCode))
where = where + " and ProductCode=’" + productCode + "’";
if (!String.IsNullOrEmpty(productName)) //支持模糊查找
where = where + " and ProductName like ’%" + productName + "%’";
string sql = "select * from tb_Product where " + where;
//从SQL Server 获取数据 ..........省略...........
//
//下面返回测试数据
DataTable test = this.GetDemoData();//返回测试数据
DataRow[] rows = test.Select(where);
//克隆 System.Data.DataTable 的结构,包括所有 System.Data.DataTable 架构和约束。
DataTable retTable = test.Clone();
foreach (DataRow row in rows)
retTable.ImportRow(row);
return retTable;
}
/// <summary>
/// 构建测试数据表
/// </summary>
/// <returns></returns>
private DataTable GetDemoData()
{
DataTable dt = new DataTable();
dt.Columns.Add("ProductCode", typeof(String));
dt.Columns.Add("ProductName", typeof(String));
dt.Columns.Add("Price", typeof(Decimal));
dt.Rows.Add("001", "原创作品CD", 99);
dt.Rows.Add("002", "Dev Express 9.2x Suit", 9960);
dt.Rows.Add("003", "可口可乐", 1.90);
dt.Rows.Add("004", "Engima CD", 269);
return dt;
}
}

如转载请注明出处,C/S框架网 www.csframework.com
GoF设计模式:原型模式(Prototype Pattern)—对象的克隆-C/S开发框架
GoF设计模式:工厂模式(Factory Pattern)-C/S开发框架
GoF设计模式:外观模式(Facade Pattern)—提供统一的入口-C/S开发框架
GoF设计模式:中介者模式(Mediator Pattern)—协调多个对象之间的交互-C/S开发框架
GoF设计模式:代理模式(Proxy Pattern)—对象的间接访问-C/S开发框架
GoF设计模式:桥接模式(Bridge Pattern)—处理多维度变化-C/S开发框架
GoF设计模式:职责链模式(Chain of Responsibility Pattern)—请求的链式处理-C/S开发框架
GoF设计模式:命令模式(Command Pattern)—请求发送者与接收者解耦-C/S开发框架
GoF设计模式:装饰模式(Decorator Pattern)—扩展系统功能-C/S开发框架
GoF设计模式:享元模式(Flyweight Pattern)—实现对象的复用-C/S开发框架
GoF设计模式:访问者模式(Visitor Pattern)—操作复杂对象结构-C/S开发框架
GoF设计模式:建造者模式(Builder Pattern)—复杂对象的组装与创建-C/S开发框架
GoF设计模式:组合模式(Composite Pattern)—树形结构的处理-C/S开发框架
GoF设计模式:迭代器模式(Iterator Pattern)—遍历聚合对象中的元素 -C/S开发框架
GoF设计模式:适配器模式(Adapter Pattern)—不兼容结构的协调-C/S开发框架
GoF设计模式:单例模式(Singleton Pattern)—确保对象的唯一性-C/S开发框架
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
