php八大设计模式之职责链模式
当发生一种事情时,我们需要要对应职责的事物去处理对应的事情。
或者去找最近的类(就是级别最低的)去解决,如果解决不了就顺着往上找职责更高的,直到解决为止。
注意:一定是要有一个职责最高的类,否则会有问题。
例子:
比如某同学骂人,我们要告诉纪委;旷课我们要告诉班长;打架我们要告诉班主任。不同情况对应不同的人,产生的结果也是不同的,在 php 中我们是怎么实现的呢?
<?php
/**
* 假设:
* 骂人:1
* 旷课:2
* 打架:3
*/
?>
面向过程实现举报:
<?php
//三种情况,该是前台传过来,这儿用数组代替了。
$arr=[1,2,3];
//随机获得一种情况。
array_push($arr,4);
shuffle($arr);
$pop=array_pop($arr);
echo $pop;
//纪委类。
class Dis{
public function go(){
echo "批评"."<br>";
}
}
//班长类。
class Monitor{
public function go(){
echo"扣5分"."<br>";
}
}
//班主任类。
class Headmaster{
public function go(){
echo "叫家长"."<br>";
}
}
if($pop==1){
//如果事态是 1.
$jg=new Dis();
$jg->go();
}else if($pop==2){
//如果事态是 2.
$jg=new Monitor();
$jg->go();
}else{
//如果事态是 3.
$jg=new Headmaster();
$jg->go();
}
?>
职责链模式完成举报功能:
<?php
header("content-type:text/html;charset=utf8");
/**
* 责任链模式完成举报功能。
* 每个对象存储着自己的权限以及上一级的引用,如果自己处理不了,交给上一级。
*/
//应该前台传值过来,这里数组代替。
$arr=[1,2,3];
//随机打乱数组,保证随机性。
shuffle($arr);
//获得数组最后一个值。
$pop=array_pop($arr);
class Dis{ #纪委类。
//权值。
protected $root=1;
//上级。
protected $up="Monitor";
public function go($int){
if($int<=$this->root){
echo "批评"."<br>";
}else{
$this->up=new $this->up;
$this->up->go($int);
}
}
}
class Monitor{ #班长类。
//权值。
protected $root=2;
//上级。
protected $up="Headmaster";
public function go($int){
if($int<=$this->root){
echo "扣5分"."<br>";
}else{
$this->up=new $this->up;
$this->up->go($int);
}
}
}
class Headmaster{ #班主任类。
protected $root=null;
protected $up=null;
public function go(){
echo "叫家长<br>";
}
}
//发生事情去找最近的职责人。
$gos= new Dis();
$gos->go($pop);
?>
管理组模式完成举报:
<?php
header("content-type:text/html;charset=utf8");
/**
* 我认为责任链没有很好的扩展性,在增加新的对应职责人员时,需要修改旧的代码,不符合“开闭原则”。
* 也可以这样实现:
*/
//应该前台传值过来,这里数组代替。
$arr=[1,2,3];
//将管理纳入一个管理组【默认】。
$roots=['Dis','Monitor','Headmaster'];
//纪委类。
class Dis{
public function go(){
echo "批评"."<br>";
}
}
//班长类。
class Monitor{
public function go(){
echo "扣5分"."<br>";
}
}
//班主任类。
class Headmaster{
public function go(){
echo "叫家长<br>";
}
}
//假如新增一个主任类。
class Director{
public function go(){
echo "停课7天<br>";
}
}
//将主任类纳入管理组。
array_push($roots,"Director");
//将事态纳入事态组。
array_push($arr,4);
//随机打乱数组,保证随机性。
shuffle($arr);
//获得数组最后一个值。
//去找对应职责的人。
$pop=array_pop($arr);
$news=new $roots[$pop-1];
$news->go();
?>
php八大设计模式之职责链模式的更多相关文章
- php设计模式之职责链模式
<?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...
- 设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...
- 设计模式-利用职责链模式消除if
本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...
- 设计模式:职责链模式(Chain Of Responsibility)
定 义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 深入理解JavaScript系列(38):设计模式之职责链模式
介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- JS常用的设计模式(15)—— 职责链模式
职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
随机推荐
- 整数翻转C++实现 java实现 leetcode系列(七)
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...
- BZOJ 2844 高斯消元 线性基
思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...
- 内存文件系统:tachyon(现在叫Alluxio)
此文于2015 年 8 月 10 日发布 Tachyon 是什么 Tachyon 是 AMPLab 开发的一款内存分布式文件系统.它介于计算层和存储层之间,可以简单的理解为存储层在内存内的一个 Cac ...
- Codeforces 930A. Peculiar apple-tree (dfs)
题目: 代码: #include <bits\stdc++.h> using namespace std; ]; //b[i]表示距离1号花絮i步的花絮的个数 map <int, l ...
- POJ 2367 Genealogical tree【拓扑排序】
题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话.现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面. 比如样例 5 ...
- 路飞学城Python-Day13
[2.常用模块-模块的种类和导入方法] 1.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长.越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...
- 服务器搭建域控与SQL Server的AlwaysOn环境过程(二) 搭建客户端节点 服务器
1. 修改客户端服务器的计算机名,重启后,如果服务器属于克隆服务器,需要修改服务器SID,如果没有则调过这一步. 命令行方式:启动Windows2008进入系统后,打开“CMD窗口”并进入到" ...
- JavaScript设计模式(biaoyansu)(2)
单例模式实例 (创建类模式): let elBalance = document.getElementById('balance') function init () { var a = new Di ...
- CodeForces-722C Destroying Array 并查集 离线操作
题目链接:https://cn.vjudge.net/problem/CodeForces-722C 题意 给个数组,每次删除一个元素,删除的元素作为一个隔断,问每次删除后该元素左右两边最大连续和 思 ...
- Docker学习总结(8)——利用Docker开启持续交付之路
持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视.持续交付讲求以短周期.小细粒度,自动化的方式频繁的交付软件,在这个过 程中要求开发.测试.用 ...