您的位置:首页 > 编程语言 > PHP开发

php八大设计模式之职责链模式

2017-03-24 15:43 531 查看
当发生一种事情时,我们需要要对应职责的事物去处理对应的事情。
或者去找最近的类(就是级别最低的)去解决,如果解决不了就顺着往上找职责更高的,直到解决为止。

注意:一定是要有一个职责最高的类,否则会有问题。


例子:

比如某同学骂人,我们要告诉纪委;旷课我们要告诉班长;打架我们要告诉班主任。不同情况对应不同的人,产生的结果也是不同的,在 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();
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息