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.'失败']; } } }