博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 机房重构-职责链模式 上机
阅读量:4220 次
发布时间:2019-05-26

本文共 3988 字,大约阅读时间需要 13 分钟。

  重构敲完很久了,但还没有加设计模式,一心想着再加几个设计模式,就找师父验收,最近一直处理专业课的东西,就拖了好久,真想说,时间过得好快,小时候盼望着时间过快点,现在大了,希望时间慢点。

###1、设计模式加在哪里?

  我所有的功能都是七层架构来实现的,那加设计模式加到哪一层呢?估计一千个人眼里就会有一千个哈姆雷特,我觉得加在哪一层都对,只要符合自己的设计理念就可以。
  七层每层的功能都已经很了解了,我选择加在B层(业务逻辑层)。理由:七层是为了换DB很方便的,因为为了不破坏七层的架构,加在B层是合情合理的,B层是创建D层的对象来访问DB的,那么就需要加在B层之前。

###2、我的重构全部都是七层架构,七层敲完了,却没能体会到,七层的解耦体现在了哪里?

  加了职责链模式之后我算是体会到了解耦的思想,其中的外观层让我体会到了编程的艺术。如果对七层的每层作用还不了解,可以先了解一下,。


###3、实现

1.添加一个类库,我命名为ChainModel,含义是职责链模式,该类库需要引用IDAL层和实体层,因为IDAL相当于职责链模式的处理对象,它不会破坏我们的抽象工厂,因为我们依赖于抽象,而不依赖于具体的D层类。
这里写图片描述

2.然后根据业务逻辑需要,增加类。

这里写图片描述
①建立“处理对象的抽象类”

public abstract  class Handler    {        protected IDAL.OnLineIDAL dal;        protected Handler successor;		//构造函数        public Handler(IDAL.OnLineIDAL dal)        {            this.dal = dal;        }		//设置上级对象的方法, 或叫做 设置下一个处理对象        public void SetSuccessor(Handler successor)        {            this.successor = successor;        }        //抽象的处理方法,让子类都去重写它,实现不同的行为,多态的原理体现        public abstract void HandleRequest(string cardno);    }

②建立“卡号是否存在的类”

public class Chain_Cardno : Handler{	public Chain_Cardno(IDAL.OnLineIDAL dal)		: base(dal)    { }    //重写父类的方法,实现多态    public override void HandleRequest(string cardno)    {        Entity.Card card = dal.OnLine(cardno); //从student表中查询该卡号的信息        if (card.CardNo == null)            throw new Exception("没有该卡号");        else            successor.HandleRequest(cardno);   //如果有该卡号,转到下一个对象去处理,或叫做 转到上级去处理     }}

③建立“余额是否充足的类”

public class Chain_Cash:Handler{	public Chain_Cash(IDAL.OnLineIDAL dal)		: base(dal)	{}	public override void HandleRequest(string cardno)	{		Entity.Card card = dal.OnLine(cardno); //从student表中,查询余额的信息		if (card.Cash <= 0)			throw new Exception("余额不足,请先充值!");		else			successor.HandleRequest(cardno);	}}

④建立“是否正在上机的类”

public class Chain_IsOnline:Handler{	public Chain_IsOnline(IDAL.OnLineIDAL dal)		: base(dal)	{}	public override void HandleRequest(string cardno)	{		Object o = dal.QueryOnLineCardno(cardno);//从正在上机表中查询,判断是否有该卡号的信息		if (o != null)			throw new Exception("卡号正在上机!");		else			successor.HandleRequest(cardno);	}}

⑤建立“添加上机的类”

public class Chain_AddOnline:Handler{	public Chain_AddOnline(IDAL.OnLineIDAL dal)		: base(dal)	{}	public override void HandleRequest(string cardno)	{		//先读取该卡号的一些信息,因为添加到上机表中需要用到		Entity.Card card = dal.OnLine(cardno);				//添加到online表中		dal.OnLineInsert(card)		//添加到历史记录中去,t_LineHistory		dal.LineHistoryInsert(card) 	}}

  此时,我们的职责链模式就建立好了,再去“客户端”调用,因为我们用了七层,所以,这里的“客户端”是我的业务逻辑层(B层)。

3.在BLL层,业务逻辑器去调用 “职责链模式” ,不用修改我们原来的上机方法,只需要添加一个方法即可

public class OnLineBLL{	//没有模式的普通上机,这里是我们原来写的上机,不修改它	public Card OnLine(string cardno) {}	//职责链模式  上机,新添职责链模式上机方法	public Card Online_model(string cardno)	{		 IFactory.OnLineFactory factory = new IFactory.OnLineFactory();//实例化工厂  		 IDAL.OnLineIDAL dal = (IDAL.OnLineIDAL)factory.Create();//调用工厂方法创建接口   		//职责链模式		//1、创建具体的处理对象,实例化时就将“处理的具体执行者”-dal传过去		ChainModel.Chain_Cardno cardno_Chain = new ChainModel.Chain_Cardno(dal);        ChainModel.Chain_Cash cash_Chain = new ChainModel.Chain_Cash(dal);        ChainModel.Chain_IsOnline isOnline_Chain = new ChainModel.Chain_IsOnline(dal);        ChainModel.Chain_AddOnline addOnline_Chain = new ChainModel.Chain_AddOnline(dal);                //2、从最开始的底层,设置它的上级,一级一级的设置        cardno_Chain.SetSuccessor(cash_Chain);        cash_Chain.SetSuccessor(isOnline_Chain);        isOnline_Chain.SetSuccessor(addOnline_Chain);                //3、从链的最底层,开始执行        cardno_Chain.HandleRequest(cardno);       		return dal.OnLine(cardno);//最后返回上机成功后需要提示的一些必要信息	}}

4.修改Facade层(外观层)的调用,只需要修改调用的方法,即可完成设计模式的转换。

public Card OnLine(string cardno){	BLL.OnLineBLL onLine=new BLL.OnLineBLL();	//原来的调用	//Card card = onLine.OnLine(cardno);		//使用职责链设计模式后的调用	Card card = onLine.Online_model(cardno);	return card;}

  到这里,职责链模式就添加完成了。


###4、总结

  重构时,使用的设计模式都是看巨人们的博客加的,敲完了,想自己加试试。开始无从下手,不知道怎么使用,都灰心丧气了,还是看一下巨人的博客是怎么加的吧,看了几篇,怪我水平有限,都看不明白怎么加进去的。。。
  用过之后才真正体会到设计模式的思想,真的很容易修改,而且不用去修改其它的类,真是很好的符合面向对象的设计原则,而且也能体会到高内聚、低耦合是个什么含义了,用了七层之后的系统,它们之间的耦合程度很低。感觉到难与痛苦的时候,就是在成长。

你可能感兴趣的文章
jdbc中Datetime与java.util.Date的相互转换
查看>>
hibernate中取得connection的方法
查看>>
如何使用log4j输出单个级别的log到指定文件
查看>>
表单元素与提示文字无法对齐的解决方法
查看>>
图片按钮消除边框
查看>>
关于汉字的正则表达式
查看>>
[转载]去除 struts2 标签中的自动生成的布局样式
查看>>
js控制html中的readonly
查看>>
在js中使用动态原型方法定义对象
查看>>
javascript注册事件的四种方式
查看>>
S.O.L.I.D五大原则之SRP(单一职责)
查看>>
自定义Struts2中的ActionErrors
查看>>
windows xp 系统CMD命令大全
查看>>
控制Highcharts中x轴和y轴坐标值的密度
查看>>
xampp下Apache + Tomcat 集群配置的简单介绍(with sticky session)
查看>>
xampp(Apache + Tomcat)与主机的域名绑定
查看>>
增加windows下Tomcat运行时的内存
查看>>
tomcat群集中session共享的几个方案
查看>>
查看windows的开关机日志
查看>>
查找google谷歌北京IP地址的方法
查看>>