C# 机房重构-职责链模式 上机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tink_bell/article/details/80683313

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

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、总结

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

猜你喜欢

转载自blog.csdn.net/Tink_bell/article/details/80683313