php设计模式课程---5、责任链模式是什么
一、总结
一句话总结:自己权限不够,就交给上级处理
1、选择结构怎么做到面向对象开闭原则?
也就是说if,都可以用接口的实现来实现,这样就避免了更新的时候修改原来代码,这就是抽象工厂。
2、责任链模式怎么实现?
就是一条链,链上的*限逐级变大,事情被最低权限的人发现,如果权限够处理,就处理,不够就交给上一级
代码实现的话就是有个基类,然后每种权限的人继承这个基类就可以了,实现里面的方法
3、php中如何从类的属性值变到方法?
$this->toper = new $this->top();//属性加了圆括号变成了方法(属性值->值->方法),比如$this->top可以是Police
4、从选择结构的责任链模式到继承类的责任链模式经历了什么?
选择模式的多种情况选择变成了类的逐级判断
5、责任链模式中,最开始发现事情的是哪一级?
总是最低级
6、责任链模式中,每个人的属性有哪些?
权限值
上级(对象名)
二、责任链模式是什么
1、相关知识
2、代码
1 <?php 2 class Admin { 3 public function __construct() { 4 if($this->top === null) { 5 return; 6 } 7 $this->toper = new $this->top();//属性加了圆括号变成了方法(属性值->值->方法) 8 } 9 10 public function proc($danger) { 11 if($danger <= $this->power) { //如果权限能解决,就解决,这里也不会出现大权限解决小问题,因为我们是从最低级的版主一层层往上走的 12 $this->doProc(); 13 } else { 14 $this->toper->proc($danger); 15 } 16 } 17 } 18 19 class Banzhu extends Admin { 20 protected $power = 1; 21 protected $top = 'Police'; 22 23 24 protected function doProc() { 25 echo '删帖'; 26 } 27 } 28 29 class Police extends Admin { 30 protected $power = 2; 31 protected $top = 'Guoan'; 32 33 public function doProc() { 34 echo '抓人'; 35 } 36 } 37 38 class Guoan extends Admin { 39 protected $power = 3; 40 protected $top = null; 41 42 public function doProc() { 43 echo '灭口'; 44 } 45 } 46 47 48 49 $danger = 3; 50 51 $admin = new Banzhu(); //不合适的帖子肯定是版主最先发现,所以这里是new的版主 52 $admin->proc($danger); 53 54 print_r($admin);
带选择结构的责任链
1 <?php 2 /** 3 布尔教育: http://www.itbool.com 4 课后论坛: http://www.zixue.it 5 **/ 6 7 /* 8 // 讲坛,举报 9 .... 10 .... 11 [举报] : 粗口 黄赌毒 反* 12 : 版主 警察 国安 13 */ 14 15 class Banzhu { 16 protected $power = 1; 17 public function proc() { 18 echo '删帖'; 19 } 20 } 21 22 class Police { 23 protected $power = 2; 24 public function proc() { 25 echo '抓人'; 26 } 27 } 28 29 class Guoan{ 30 protected $power = 3; 31 public function proc() { 32 echo '灭口'; 33 } 34 } 35 36 37 $jb = $_POST['jubao'] = 2; 38 39 if($jb == 1) { 40 $admin = new Banzhu(); 41 } else if($jb = 2) { 42 $admin = new Police(); 43 } else if($jb = 3) { 44 $admin = new Guoan(); 45 } 46 47 $admin->proc(); 48 49 50 ?>