php八大设计模式之职责链模式
2017-03-28 20:33
501 查看
当发生一种事情时,我们需要要对应职责的事物去处理对应的事情。 或者去找最近的类(就是级别最低的)去解决,如果解决不了就顺着往上找职责更高的,直到解决为止。 注意:一定是要有一个职责最高的类,否则会有问题。
例子:
比如某同学骂人,我们要告诉纪委;旷课我们要告诉班长;打架我们要告诉班主任。不同情况对应不同的人,产生的结果也是不同的,在 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 c225 =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设计模式---职责和单例模式
- 17. 星际争霸之php设计模式--职责链模式
- php八大设计模式之适配器模式
- PHP八大设计模式
- php八大设计模式之工厂模式
- PHP设计模式8-职责链模式
- php八大设计模式之装饰器模式
- php八大设计模式之装饰器模式
- php八大设计模式之桥接模式
- 职责链模式 - 设计模式 - PHP版
- PHP草根论之设计模式-职责链模式
- php八大设计模式之观察者模式
- PHP八大设计模式
- php八大设计模式之策略模式
- php设计模式 Chain Of Responsibility (职责链模式)
- php实现设计模式之 职责链模式
- php八大设计模式之工厂模式
- php八大设计模式之单例模式
- php八大设计模式之观察者模式