开发应用-职责链模式(Chain Of Resposibility Pattern)
开发应用-职责链模式(Chain Of Resposibility Pattern)
职责链模式(Chain Of Resposibility Pattern) 整理代码时找到一些好东西分享出来给大家学习,这是应用在RFID系统中读卡程序的接口。 职责链模式: 意图:适用于多个对象都有机会处理请求,从而避免请求的发送者或接受者 之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求, 直到有一个对象处理它为止。 适用性:有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动 确定你想在不明确指定接收者的情况下,向多个对象中的一个提交一个 请求可处理一个请求的对相机和应被动太指定。 /// <summary> /// 职责链模式接口 /// </summary> public interface IChain { IChain Next { get; set; } //下一个职责链 void HandleRequest(string request); } /// <summary> /// 定义一个职责链基类 /// </summary> public abstract class ChainBase : IChain { protected ListBox _Log; protected IChain _NextChain; public virtual void HandleRequest(string request) { } public IChain Next { get { return _NextChain; } set { _NextChain = value; } } } /// <summary> /// 刷员工卡上下班或报工 /// </summary> public class ChainEmployeeCard : ChainBase { public ChainEmployeeCard(ListBox log) { _Log = log; } public override void HandleRequest(string request) { string employees = ",E01,E02,E03,"; //模拟员工表的数据 if (employees.IndexOf(request) > 0) //如果员工表存在该卡号,由当前职责链处理请求 { //在这里处理请求.... _Log.Items.Add(request.ToUpper() ":调用ChainEmployeeCard职责链进行处理!"); } else if (_NextChain != null) { _NextChain.HandleRequest(request); } } } /// <summary> /// 刷产品卡进行报工 /// </summary> public class ChainProductCard : ChainBase { public ChainProductCard(ListBox log) { _Log = log; } public override void HandleRequest(string request) { string productCards = ",P01,P02,P03,"; //模拟产品表的数据,每个产品编号对应一个ID卡号 if (productCards.IndexOf(request) > 0)//如果产品表存在该卡号(ID),由当前职责链处理请求 { //在这里处理请求.... _Log.Items.Add(request.ToUpper() ":调用ChainProductCard职责链进行处理!"); } else if (_NextChain != null) { _NextChain.HandleRequest(request); } } } /// <summary> /// 刷批卡进行报工 /// </summary> public class ChainBatchCard : ChainBase { public ChainBatchCard(ListBox log) { _Log = log; } public override void HandleRequest(string request) { //模拟批卡表的数据,批卡是指一组产品的编号,每个批卡编号对应一个ID卡号 string batchCards = ",B01,B02,B03,"; if (batchCards.IndexOf(request) > 0)//如果批卡表存在该卡号(ID),由当前职责链处理请求 { //在这里处理请求.... _Log.Items.Add(request.ToUpper() ":调用ChainBatchCard职责链进行处理!"); } else if (_NextChain != null) { _NextChain.HandleRequest(request); } } } /// <summary> /// 处理无法识别的卡号,是职任链的终端 /// </summary> public class ChainInvalidRequest : ChainBase { public ChainInvalidRequest(ListBox log) { _Log = log; } public override void HandleRequest(string request) { //这个职责链是处理终端,再也不会调用下一个职责链处理请求了 // _Log.Items.Add(request.ToUpper() ":调用ChainInvalidRequest职责链进行处理!"); _Log.Items.Add("请求无法识别!"); } } /// <summary> /// 职责链生成器. 实际是一个标准的生成器模式 /// </summary> public class ChainBuilder { /// <summary> /// 生成一个职责链. (链头)A->B->C->D->E->F->...n->终端职责(链尾) /// </summary> public static IChain BuildChain(ListBox log) { //链头,分析是否管理卡号的优先级最高. 链头可以自由更改 IChain header = new ChainCommandCard(log);//链头 IChain chain = header; //建立职责链处理顺序. 如需求有变在这里调整职责链顺序 chain = chain.Next = new ChainEmployeeCard(log); chain = chain.Next = new ChainBatchCard(log); chain = chain.Next = new ChainProductCard(log); chain = chain.Next = new ChainInvalidRequest(log); return header;//返回职责链实例 } } // 来源:www.CSFramework.com, C/S结构框架学习网 主窗体的代码: public partial class frmMain : Form { private IChain _MyChain = null; public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { //调用生成器创建一个完整的职责链 _MyChain = ChainBuilder.BuildChain(this.listBox1); } private void btnAnalysis_Click(object sender, EventArgs e) { if (txtCardNo.Text.Length < 3) { MessageBox.Show("卡号太短啦!"); return; } if (txtCardNo.Text.Trim() != "") { _MyChain.HandleRequest(txtCardNo.Text.ToUpper().Trim()); //分析请求,匹配职责链.... txtCardNo.Clear(); txtCardNo.Focus(); } } private void btnClear_Click(object sender, EventArgs e) { listBox1.Items.Clear(); } private void frmMain_Activated(object sender, EventArgs e) { txtCardNo.Focus(); } } // 来源:www.CSFramework.com, C/S结构框架学习网 请下载附件 (Source for VIP) 扫一扫加作者微信
参考文档:
开发应用-命令模式(C#实现POS收银功能) 开发应用-观察者模式之C#实现缓存数据更新 开发应用 - 策略模式(Strategy Pattern) 常用设计模式 设计模式 - 外观模式应用(Façade Pattern) 开发应用-RepositoryItemLookUpEdit显示名称 C#设计模式应用-单件模式(Singleton Pattern) WCF开发框架IIS承载WCF - Website站点承载改为ASP.NET网站应用程序承载 WCF开发框架-IIS启用net.tcp协议发现不会自动执行Global应用程序解决方案 WCF开发框架-客户端采用Certificate认证模式调用基于HTTPS协议的WCF接口 企业应用软件开发平台|软件开发平台有那些? .Net开发服务器服务端应用程序 - WebApi后端开发框架 桌面应用开发框架 - Windows桌面程序开发工具 软件公司开发平台 - 15年致力于应用软件快速开发平台 应用软件开发平台 - 软件开发定制平台 企业级应用WebApi框架, 服务端WebApi接口开发框架
其它资料:
什么是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内容管理系统 | |