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处理请求)
定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ...
随机推荐
- Oracle 11gR1 RAC存储迁移方案
一.需求Oracle 11gR1 RAC存储计划更换,数据库版本为11.1.0.7,无停机维护窗口. 二.环境准备1.主机环境.OS环境2.安装11.1.0.6.0版Clusterware(linux ...
- Python:Day55 ORM多表操作
命令行创建UTF8数据库: CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 创建多表(外键)
- flask_socket_io中报错RuntimeError: You need to use the eventlet server. See the Deployment section of the documentation for more information.的解决办法
最新的flask_socketio 使用的是python-socketio 如果在包中安装了gevent或evenlet,在服务器上使用时,就会报错 RuntimeError: You need to ...
- tomcat的Jsp执行
Tomcat 会把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina\<主机名>\<应用程序名> ...
- ASP MD5
<% Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WOR ...
- 反射那些基础-Class
目录 1 Class 类是什么? 2 如何获取 Class 对象 2.1 Object.getClass() 2.2 .class 语法 2.3 Class.forName() 2.4 通过包装类的 ...
- zookeeper-如何修改源码-《每日五分钟搞定大数据》
本篇文章仅仅是起一个抛砖迎玉的作用,举一个如何修改源码的例子.文章的灵感来自 ZOOKEEPER-2784. 提一个问题先 之前的文章讲过zxid的设计,我们先复习下: zxid有64位,分成两部分: ...
- storm自定义分组与Hbase预分区结合节省内存消耗
Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗. ...
- WCF系列教程之WCF服务配置工具
本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...
- VMware vSphere 6 序列号
vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8CKQ8 NV09R-2W007-08D38-C ...