责任链(Chain of Responsibility)模式
责任链是一种对象的行为模式,很多对象由每一个对象对其下家的引用而连接起来形成的一条链.请求在这条链上传递,直到链上得某一个对象决定处理这个请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
责任链模式的结构
抽象处理者(Handler)角色: 定义一个处理接口.
具体处理者(ConcreteHandler)角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
应用案例
场景: 帖子的举报处理 一篇帖子,你可以点击举报.将违规的内容举报给,版主,管理员,甚至公安 用责任链模式前我们可能这样写. if(粗口){ 启动转发给版主的流程 }else if(粗口+威胁){ 启动转发给管理员的流程 }else if(黄赌毒){ 启动转发给公安的流程 }else{ ......... } 问题在哪? 1 . 处理流程都写在if else里.如果要新增举报级别或者流程内部有改动就需要修改if else里的代码.违反了开闭原则. 2 . 逻辑判断和执行对象耦合严重.违反了低耦合原则.
解决方法 - 责任链模式
设3个对象,版主,管理员,公安.
每个对象都存储着对上一级对象的引用,如果自己处理不了,交给上一级.
案例代码实现
<?php //处理接口 interface handle { public function doing($dev); } //转发版主类 class bzHandle implements handle{ public $topClass = 'adminHandle'; public function doing($dev){ if($dev == 1){ echo '版主处理--删帖'; //如果在自己权限范围内,则处理 }else{ $top = new $this->topClass; //不在权限内,提交给上级 $top->doing($dev); } } } //转发管理员类 class adminHandle implements handle{ public $topClass = 'plHandle'; public function doing($dev){ if($dev == 2){ echo '管理员处理--封IP+删帖'; }else{ $top = new $this->topClass; $top->doing($dev); } } } //转发公安类 class plHandle implements handle{ public $topClass = null; public function doing($dev){ if($dev == 3){ echo '通知公安'; } } } $handle = new bzHandle(); //直接提交给版主,后面就不管了. $handle->doing(3); ?>