python设计模式第十九天【职责链模式】
1.应用场景
(1)将一个任务拆分为具有顺序的多个部分,每个类完成相应的部分,并且顺序执行
(2)软件窗口的消息传播
(3)SERVLET容积的过滤器Filter的实现
2.代码实现
#!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from abc import ABCMeta, abstractmethod class Handler(object): @abstractmethod def handle(self): '''具体处理方法在子类中实现''' pass def handleNext(self): '''处理下一个''' if hasattr(self, "next_handler") and self.next_handler is not None: self.next_handler.handle() def setNextHanndler(self, next_handler): '''设置下一个处理器''' self.next_handler = next_handler class OneHandler(Handler): def handle(self): print "one handle" self.handleNext() class TwoHandler(Handler): def handle(self): print "two handle" self.handleNext() class ThreeHandler(Handler): def handle(self): print "three handle" self.handleNext() if __name__ == "__main__": oneHandler = OneHandler() twoHandler = TwoHandler() threeHandler = ThreeHandler() oneHandler.setNextHanndler(twoHandler) twoHandler.setNextHanndler(threeHandler) oneHandler.handle()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day19_cor/cor_test.py one handle two handle three handle Process finished with exit code 0
例如:库存报损报溢作废功能需要检测报损报溢是否已经生成了单据,如果生成了单据则提示先作废相关的单据,否则直接作废报损报溢
<?php namespace core\models; use \core\models\WmsProfitloss; class WmsProfitlossDeleterContext{ private $__profitlossModel; private $__firstHandler; public function __construct($profitlossModel) { $this->__profitlossModel = $profitlossModel; } public function getProfitlossModel(){ return $this->__profitlossModel; } public function setFirstHandler(MyHandler $firstHandler){ $this->__firstHandler = $firstHandler; } public function getFirstHandler(){ return $this->__firstHandler; } public function request(){ $checkGenSheetHandler = new CheckGenSheetHandler($this->getProfitlossModel()); $deleteHandler = new DeleteHandler($this->getProfitlossModel()); $checkGenSheetHandler->setNextHandler($deleteHandler); return $this->getFirstHandler()->handle(); } } abstract class MyHandler{ private $nextHandler; protected $__profitlossModel; public function __construct(WmsProfitloss $profitlossModel) { $this->__profitlossModel = $profitlossModel; } public abstract function handle(); public function handleNext(){ if (isset($this->nextHandler) && !empty($this->nextHandler)){ return $this->nextHandler->handle(); } } public function setNextHandler(MyHandler $nextHandler){ $this->nextHandler = $nextHandler; } } class CheckGenSheetHandler extends MyHandler{ public function handle(){ $notDelSheetNumberList = $this->__profitlossModel->getGeneratedNotDelSheetNumberList(); if (!empty($notDelSheetNumberList)){ $notDelSheetNumberStr = implode(',', $notDelSheetNumberList); return ['status'=>true, 'errcode'=>'', 'errmsg'=>'请先作废单据'. $notDelSheetNumberStr]; } return $this->handleNext(); } } class DeleteHandler extends MyHandler{ public function handle(){ $handleResult = $this->__profitlossModel->delete(); if ($handleResult){ $this->handleNext(); } if ($handleResult){ return ['status'=>true, 'errcode'=>'', 'errmsg'=>'作废'.$this->__profitlossModel->wms_profitloss_code.'成功']; }else{ return ['status'=>false, 'errcode'=>'', 'errmsg'=>'作废'.$this->__profitlossModel->wms_profitloss_code.'失败']; } } }
python设计模式第十九天【职责链模式】的更多相关文章
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 重温设计模式(三)——职责链模式(chain of responsibility)
一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...
- javascript设计模式学习之十三——职责链模式
一.职责链的定义和使用场景 职责链模式的定义是,职责链模式将一系列可能会处理请求的对象连接成一条链,请求在这些对象之间一次传递,直到遇到一个可以处理它的对象.从而避免请求的发送者和接收者之间的耦合关系 ...
- js设计模式(12)---职责链模式
0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...
- C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...
- 设计模式 --> (15)职责链模式
职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 示例 考虑员工要求加薪.公司的管理者一共有 ...
- JS设计模式(10)职责链模式(重要)
什么是职责链模式? 重要性:4 星,在项目中能对 if-else 语句进行优化 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到 ...
- 二十:职责链模式详解(类似于spring的hangler处理请求)
定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ...
随机推荐
- iptables snat 和dnat说明
iptables中的snat和dnat是非常有用的,感觉他们二个比较特别,所以单独拿出来说一下. dnat是用来做目的网络地址转换的,就是重写包的目的IP地址.如果一个包被匹配了,那么和它属于同一个流 ...
- Quartz动态添加定时任务执行sql(服务启动添加+手动添加)
系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...
- TFT2.2
https://cdn-learn.adafruit.com/downloads/pdf/2-2-tft-display.pdf
- linux之dos2unix命令
今天在使用脚本升级的时候碰到一个问题,然后写了一个简单的自测脚本进行测试,如上图,理论上应该输出 /usr/local/mysql/bin/mysqldump -h 127.0.0.1 -uroot ...
- 建一个网站python
域名()+ 服务器+ 源码 制作一个自己的网站.................
- 大数据不就是写SQL吗?
应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句: "不就是写SQL吗,要那么久吗" 我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki 贴出来给大家 ...
- 美橙互联SSL 部署到IIS 7以上
前言:立秋已至,汗流浃背,感觉夏天正到最热的时候...广州某一“著名”大厦 老板:穆德(我),现在要开发个微信小程序.开搞吧. 我:纳尼?好吧.需要购买SSL证书(⊙o⊙)? 老板:神马鬼,有没有免费 ...
- 异步时代-java的协程路在何方
面试官:你知道协程吗? 你:订机票的那个吗,我常用. 面试官:行,你先回去吧,到时候电话联系 ........ 很尴尬,但是事实是,很大一部分的程序员不知道协程是啥玩意,更大一部分的程序员,项目中没用 ...
- 线程GIL锁 线程队列 回调函数
----------------------------------无法改变风向,可以调整风帆;无法左右天气,可以调整心情.如果事情无法改变,那就去改变观念. # # ---------------- ...
- 整数划分 poj3181
分析 因为n,m分别最大1000,100 所以结果会超过ll,要用两个来存大数的两部分 代码 #include<iostream> #include<algorithm> #i ...