最近重构代码发现责任链模式非常实用,所以简单总结了一下。总体来说,责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景。比如是根据不同会员等级给予不同的优惠力度。

它的定义:对象的调用是由下家的应用连接起来的处理链。一直不断在链上传递,直到有某个对象可以处理为止。

我个人的理解:就像一个人要举报某个高官贪污,要先从当地法院进行提案举报,当地法院权限不足,然后将这个事儿继续上报给中级人民法院,中级人民法院发现无权处理,又把举报再上报给最高法,in the end 最高法依法受理。

它的好处:

1.解耦。使用单一职责的处理类去处理不同场景条件下的业务,达到解耦,方便后期扩展和维护。

2.客户端无感。请求方不用知道具体是哪个处理类完成了请求处理,将处理过程交给系统内部。

3.可扩展性。可以动态重新组织链式和分配责任,当有新的case的时候就增加一个节点处理类即可,不用改变调用过程。

具体例子如下:

<?php
/**
* Created by PhpStorm.
* User: tonny
*/ abstract class Handler {
protected $higher = null;
abstract public function operation($lev);
}

// 房间主人
class RoomMaster extends Handler {
protected $higher = "admin"; public function operation($lev)
{
// TODO: Implement operation() method.
if ($lev <= 1) {
echo "房间主人搞定!";
} else {
$higher = $this->higher;
$this->higher = new $higher();
$this->higher->operation($lev);
}
}
}

// 管理员
class Admin extends Handler {
protected $higher = "God"; public function operation($lev)
{
// TODO: Implement operation() method.
if ($lev <= 50) {
echo "Admin搞定";
} else {
echo "God搞定";
}
}
} $try = new RoomMaster();
$lev = rand(0, 100); $try->operation($lev);

总结:利用php的动态特性,将下一个节点的类保存在每个处理类中的$higher变量中,通过$lev来判断是当前处理类是否处理得过来,如果能处理则处理,不能处理则交给$higher。

php设计模式-责任链模式的更多相关文章

  1. java 设计模式 -- 责任链模式

    设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...

  2. 浅谈Python设计模式 -- 责任链模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...

  3. 【设计模式】Java设计模式 - 责任链模式

    [设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...

  4. 我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  5. Java设计模式-责任链模式

    提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...

  6. Java与设计模式-责任链模式

    责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...

  7. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  8. php 23种设计模式 - 责任链模式

    责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...

  9. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

随机推荐

  1. 百度地图 Android SDK - 新的版本号(v3.2.0)正式上线

    百度地图 Android SDK v3.2.0 在版本号 2014 年 11 月 07 日本正式推出工作完成! watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  2. .net core 允许跨域

    在Startup的ConfigureServices()中添加services.AddCors()在Startup的Configure()中添加app.UseCors(); 保证其在app.UseMv ...

  3. WPF ListView的使用

    <Window x:Class="XamlTest.Window14"        xmlns="http://schemas.microsoft.com/win ...

  4. JS 两种数组类型

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  5. CreateThread传递多个参数的方法(利用结构体的参数指针)

    很多朋友一直都在问CreateThread如何传递多个参数,CreateThread传递参数的方式是指针传递的,所以这里也可以利用指针来做!Demo 关键代码如下: type  TfrmTestThr ...

  6. Win8 Metro(C#)数字图像处理--3.4图像信息熵计算

    原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...

  7. MessageBox用法大全

    //1.显示提示信息 MessageBox.Show("Hello World!"); //2.给消息框加上标题 MessageBox.Show("Hello World ...

  8. UWP 设置控件样式四种方法

    1.隐式方法,通过仅指定 Style 的 TargetType.(设置全部的Button样式) <Page.Resources > <Style TargetType="B ...

  9. ML:多变量线性回归(Linear Regression with Multiple Variables)

    引入额外标记 xj(i) 第i个训练样本的第j个特征 x(i) 第i个训练样本对应的列向量(column vector) m 训练样本的数量 n 样本特征的数量 假设函数(hypothesis fun ...

  10. Python 2, Python 3, Stretch & Buster

    Python 2.7的终止支持时间为2020年,现在已经是2015年了,然而Debian中仍然有大量软件包是基于Python 2的实现.Debian的维护者开始认真讨论淘汰Python 2.开发者Pa ...