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