请求的链式处理——职责链模式(一)

探讨了职责链模式在软件设计中的应用,通过一个采购审批子系统的案例,展示了如何利用职责链模式解决分级审批流程中的问题,提高系统的灵活性和可维护性。
               

      “一对二”,“过”,“过”……这声音熟悉吗?你会想到什么?对!纸牌。在类似“斗地主”这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌。在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求。在设计模式中,我们也有一种专门用于处理这种请求链式传递的模式,它就是本章将要介绍的职责链模式。

 

16.1 采购单的分级审批

      Sunny软件公司承接了某企业SCM(Supply Chain Management,供应链管理)系统的开发任务,其中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如图16-1所示:

图16-1 采购单分级审批示意图

      如何在软件中实现采购单的分级审批?Sunny软件公司开发人员提出了一个初始解决方案,在系统中提供一个采购单处理类PurchaseRequestHandler用于统一处理采购单,其框架代码如下所示:

//采购单处理类class PurchaseRequestHandler //递交采购单给主任 public void sendRequestToDirector(PurchaseRequest request) {  if (request.getAmount() < 50000) {   //主任可审批该采购单   this.handleByDirector(request);  }  else if (request.getAmount() < 100000) {   //副董事长可审批该采购单   this.handleByVicePresident(request);  }  else if (request.getAmount() < 500000) {   //董事长可审批该采购单   this.handleByPresident(request);  }  else {   //董事会可审批该采购单   this.handleByCongress(request);  } }  //主任审批采购单 public void handleByDirector(PurchaseRequest request) {  //代码省略 }  //副董事长审批采购单 public void handleByVicePresident(PurchaseRequest request) {  //代码省略 }  //董事长审批采购单 public void handleByPresident(PurchaseRequest request) {  //代码省略 }  //董事会审批采购单 public void handleByCongress(PurchaseRequest request) {  //代码省略 }}

        问题貌似很简单,但仔细分析,发现上述方案存在如下几个问题:

       (1)PurchaseRequestHandler类较为庞大,各个级别的审批方法都集中在一个类中,违反了“单一职责原则”,测试和维护难度大。

       (2)如果需要增加一个新的审批级别或调整任何一级的审批金额和审批细节(例如将董事长的审批额度改为60万元)时都必须修改源代码并进行严格测试,此外,如果需要移除某一级别(例如金额为10万元及以上的采购单直接由董事长审批,不再设副董事长一职)时也必须对源代码进行修改,违反了“开闭原则”。

       (3)审批流程的设置缺乏灵活性,现在的审批流程是“主任-->副董事长-->董事长-->董事会”,如果需要改为“主任-->董事长-->董事会”,在此方案中只能通过修改源代码来实现,客户端无法定制审批流程。

       如何针对上述问题对系统进行改进?Sunny公司开发人员迫切需要一种新的设计方案,还好有职责链模式,通过使用职责链模式我们可以最大程度地解决这些问题,下面让我们正式进入职责链模式的学习。

【作者:刘伟  http://blog.youkuaiyun.com/lovelion

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

### 回答1: 长短期记忆网络Long Short Term Memory Networks,LSTM)是一种用于处理序列数据的深度学习模型,用于解决传统循环神经网络(RNN)中的梯度消失问题。 Python是一种通用的编程语言,可以使用Python编写LSTM模型。在Python中,可以使用多个深度学习框架(如TensorFlow、Keras、PyTorch等)中的库来实现LSTM网络。 要实现LSTM模型,首先需要导入相应的深度学习库。然后,通过定义模型的参数、数据预处理、定义LSTM层、编译模型、训练模型和评估模型等步骤来构建LSTM网络。在编写代码时,可以使用Python的强大的科学计算库来处理数据和进行数学计算。 在使用Python实现LSTM时,可以根据具体的需求进行调整和优化模型的结构和参数。可以通过调整LSTM层的单元数、增加隐藏层、引入正则化和优化算法来提高模型性能。此外,还可以使用交叉验证和调参技术来选择最佳的超参数。 Python作为一种简洁易用的编程语言,提供了丰富的工具和库来支持LSTM模型的实现和应用。通过使用Python,我们可以轻松地构建和使用LSTM网络,从而应用于各种序列数据相关的任务,如语音识别、自然语言处理、时间序列预测等。 ### 回答2: 长短期记忆网络Long Short Term Memory Networks,简称LSTM)是一种特殊的循环神经网络(Recurrent Neural Networks,简称RNN),用于处理和预测序列数据。 在Python中,我们可以使用一些开源的深度学习框架,如TensorFlow或PyTorch,来构建和训练LSTM网络。这些框架提供了一系列函数和类,可以轻松地构建、训练和测试LSTM模型。 首先,我们需要导入相应的库和模块。例如,在TensorFlow中,我们可以使用`import tensorflow as tf`来导入TensorFlow库。 接下来,我们可以定义LSTM模型的结构。LSTM网络由多个LSTM单元组成,每个单元有一个隐藏状态和一个记忆单元。我们可以使用框架提供的API来定义一个LSTM层,并设置相应的参数,如隐藏单元的数量和输入序列的长度。 然后,我们可以定义模型的其余部分,如输入层、输出层和损失函数。根据具体任务的要求,我们可以选择不同的网络结构和损失函数来满足需求。 接下来,我们可以进行模型的训练。我们需要提供训练数据和标签,并选择适当的优化算法来更新模型的参数。通过迭代训练过程,我们可以逐渐改善模型的性能。 最后,我们可以使用训练好的模型对新的数据进行预测。我们可以加载保存的模型,并使用它来预测新的序列数据。 总之,使用Python可以方便地构建和训练LSTM网络。通过选择适当的开源深度学习框架和实现合适的网络结构,我们可以有效地在序列数据任务中应用LSTM网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值