C#设计模式-窗体基类模板方法定义
C#设计模式-窗体基类模板方法定义
模板方法模式(Template Method Pattern) 模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。 a.模版方法 一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。 b.基本方法 基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和
具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。在C#语言里面,一个具体方法 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现, 作为方法的默认实现。(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 partial class frmBase : Form
{ 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 partial class frmProduct : CSFramework.TemplateMethodDemo.frmBase { 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
参考文档:
C# 如何设计一个标准的等待窗体 开发应用 - 策略模式(Strategy Pattern) 常用设计模式 C# 模拟VisualStudio窗体设计器拖放控件 设计模式 - 外观模式应用(Façade Pattern) C#设计模式应用-单件模式(Singleton Pattern) C# 使用设计模式构建通用数据库访问类 C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象 标签:C#.Net组件开发 - 属性窗体内显示自定义名称 标签:C#.Net组件开发 - 自定义设计器持久化对象的属性 作为一个学生,想问下这套框架是三层架构吗?使用了那些设计模式? C#.NET 定义动态对象dynamic以及属性和方法 C# 基于MessageBox类封装的Msg类对话框,定义提问、错误、警告、提示4个通用方法 C# Dev 财务科目(财务结算收支类目) 树状结构数据编辑窗体设计 主窗体模块列表没有翻译多语言 - 重写SetLanguage方法自定义显示多语言
其它资料:
什么是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内容管理系统 | |