PHP培训
美国上市PHP培训机构

400-111-8989

热门课程

PHP设计模式 — 责任链模式

  • 发布:PHP培训
  • 来源:网络
  • 时间:2018-06-11 18:33

PHP是一个使用者非常多的开发语言,但在每个领域里的开发侧重点有所不同互联网方面,在稳定的基础上,更注重性能、高并发,高负载的处理。那么在当下的互联网时代,php程序员的需求是越来越大。所以转行来做php的人也越来多,达内php培训班新一期即将开班,欢迎同学们垂询哦!那么我们见天讲到的就是php培训课程中的PHP设计模式 — 责任链模式(Chain Of Responsibilities)。

职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。

责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。

当ConcreteHandler(具体的处理程序)不知道如何满足来自Client的请求时,或它的目的不是这个时,它会委派给链中的下一个Handler(处理程序)来处理。

这个设计模式通常和复合模式一起使用,其中有些叶子或容器对象默认委派操作给它们的父对象。另一个例子是,本地化通常是使用责任链处理的,当德语翻译适配器没有为翻译关键词找到合适的结果时,就返回到英语适配器或干脆直接显示关键词本身。

耦合减少到最低限度:Client类不知道由哪个具体的类来处理请求;在创建对象图时配置了链;ConcreteHandlers不知道哪个对象是它们的继承者。行为在对象之间分配是成功的,链中最近的对象有优先权和责任满足请求。

参与者:

◆Client(客户端):向Handler(处理程序)提交一个请求;

◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;

◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。

下面的代码实现了一个最著名的责任链示例:多级缓存。代码如下:

/**

* The Handler abstraction. Objects that want to be a part of the

* ChainOfResponsibility must implement this interface directly or via

* inheritance from an AbstractHandler.

*/

interface KeyValueStore

{

/**

* Obtain a value.

* @param string $key

* @return mixed

*/

public function get($key);

}

/**

* Basic no-op implementation which ConcreteHandlers not interested in

* caching or in interfering with the retrieval inherit from.

*/

abstract class AbstractKeyValueStore implements KeyValueStore

{

protected $_nextHandler;

public function get($key)

{

return $this->_nextHandler->get($key);

}

}

/**

* Ideally the last ConcreteHandler in the chain. At least, if inserted in

* a Chain it will be the last node to be called.

*/

class SlowStore implements KeyValueStore

{

/**

* This could be a somewhat slow store: a database or a flat file.

*/

protected $_values;

public function __construct(array $values = array())

{

$this->_values = $values;

}

public function get($key)

{

return $this->_values[$key];

}

}

/**

* A ConcreteHandler that handles the request for a key by looking for it in

* its own cache. Forwards to the next handler in case of cache miss.

*/

class InMemoryKeyValueStore implements KeyValueStore

{

protected $_nextHandler;

protected $_cached = array();

public function __construct(KeyValueStore $nextHandler)

{

$this->_nextHandler = $nextHandler;

}

protected function _load($key)

{

if (!isset($this->_cached[$key])) {

$this->_cached[$key] = $this->_nextHandler->get($key);

}

}

public function get($key)

{

$this->_load($key);

return $this->_cached[$key];

}

}

/**

* A ConcreteHandler that delegates the request without trying to

* understand it at all. It may be easier to use in the user interface

* because it can specialize itself by defining methods that generates

* html, or by addressing similar user interface concerns.

* Some Clients see this object only as an instance of KeyValueStore

* and do not care how it satisfy their requests, while other ones

* may use it in its entirety (similar to a class-based adapter).

* No client knows that a chain of Handlers exists.

*/

class FrontEnd extends AbstractKeyValueStore

{

public function __construct(KeyValueStore $nextHandler)

{

$this->_nextHandler = $nextHandler;

}

public function getEscaped($key)

{

return htmlentities($this->get($key), ENT_NOQUOTES, 'UTF-8');

}

}

// Client code

$store = new SlowStore(array('pd' => 'Philip K. Dick',

'ia' => 'Isaac Asimov',

'ac' => 'Arthur C. Clarke',

'hh' => 'Helmut Heißenbüttel'));

// in development, we skip cache and pass $store directly to FrontEnd

$cache = new InMemoryKeyValueStore($store);

$frontEnd = new FrontEnd($cache);

echo $frontEnd->get('ia'), "\n";

echo $frontEnd->getEscaped('hh'), "\n";

关于PHP责任链设计模式的一些实现说明:

◆责任链可能已经存在于对象图中,和复合模式的例子一样;

◆此外,Handler抽象可能存在,也可能不存在,最好的选择是一个分开的Handler接口只可以执行handleRequest()操作,不要强制一个链只在一个层次中,因为后面的已经存在了;

◆也可能引入一个抽象类,但由于请求处理是一个正交关注,因此具体的类可能已经继承了其它类;

◆通过constructor 或setter,Handler(或下一个Handler)被注入到Client或前一个Handler;

◆请求对象通常是一个ValueObject,也可能被实现为一个Flyweight,在PHP中,它可能是一个标量类型,如string,注意在某些语言中,一个string就是一个不变的ValueObject。

简单的总结责任链模式,可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

 

更多关于php培训类的相关知识请关注php培训官网

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容

免费预约企业总监级讲师试听课

怕钱不够?就业挣钱后再付学费!     怕学不会?0基础入学,达内定制课程!     担心就业?近12万家雇主企业,推荐名企就业!

上一篇:PHP if...else...elseif 语句的教程
下一篇:php 5.4以下版本json如何发送微信客服消息

PHP四大主流框架的优缺点总结

php基础知识讲解

Rewrite规则学习记录

php开发中10个容易出错的坑

选择城市和中心
贵州省

广西省

海南省