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设计模式第十九天【职责链模式】的更多相关文章

  1. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  2. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  3. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  4. 重温设计模式(三)——职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  5. javascript设计模式学习之十三——职责链模式

    一.职责链的定义和使用场景 职责链模式的定义是,职责链模式将一系列可能会处理请求的对象连接成一条链,请求在这些对象之间一次传递,直到遇到一个可以处理它的对象.从而避免请求的发送者和接收者之间的耦合关系 ...

  6. js设计模式(12)---职责链模式

    0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...

  7. C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...

  8. 设计模式 --> (15)职责链模式

    职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 示例 考虑员工要求加薪.公司的管理者一共有 ...

  9. JS设计模式(10)职责链模式(重要)

    什么是职责链模式? 重要性:4 星,在项目中能对 if-else 语句进行优化 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到 ...

  10. 二十:职责链模式详解(类似于spring的hangler处理请求)

    定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. “看这个定义,就是将一堆可以处理请求的对象连 ...

随机推荐

  1. Vue.js项目详解

    还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...

  2. Luogu2860 [USACO06JAN]冗余路径Redundant Paths

    Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...

  3. koa-convert源码分析

    koa-convert最主要的作用是:将koa1包中使用的Generator函数转换成Koa2中的async函数.更准确的说是将Generator函数转换成使用co包装成的Promise对象.然后执行 ...

  4. Docker镜像构建

    一.简介 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议.通常镜像的制作有两种方式: 使用现有的容器使用docker commit 生成镜像 使用Docke ...

  5. Node.js配合jQuery UI autocomplete的应用

    Node.js擅长的领域为: 不需要很多运算 吞吐量要求高 进消息轻并且要求快 出消息轻并且要求快 网上的例子都是socket.io的,我一直在想到底能用在什么地方?根据node.js的优点(擅长领域 ...

  6. 微服务之:从零搭建ocelot网关和consul集群

    介绍 微服务中有关键的几项技术,其中网关和服务服务发现,服务注册相辅相成. 首先解释几个本次教程中需要的术语 网关 Gateway(API GW / API 网关),顾名思义,是企业 IT 在系统边界 ...

  7. 设计模式之单例模式(C#)

    本文来自于本人个人微信公众号,欢迎关注本人微信公众号,二维码附在文章末尾~~~ 一直都特别羡慕能写文章的人,但是由于本人比较懒再加上写文章功底实在是just so so,所以就一搁再搁,最近突然觉得自 ...

  8. UnderWater+SDN论文之六

    Protocol Emulation Platform Based on Microservice Architecture for Underwater Acoustic Networks Sour ...

  9. Five Dimensional Points CodeForces - 851C (计算几何+暴力)

      C. Five Dimensional Points time limit per test 2 seconds memory limit per test 256 megabytes input ...

  10. Innodb日志与事务

    1.Innodb日志: 错误日志:记录出错信息,也记录一些警告信息或者正确的信息. 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行. 慢查询日志:设置一个阈值,将运行时间超过该 ...