龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 多级缓存的实现---责任链模式

时间:2015-04-02 11:48来源:网络整理 作者:网络 点击:
分享到:
多级缓存的实现---责任链模式 多级缓存责任链模式。 * client提交给 hander,hander发现责任链上能处理该任务的函数,处理;可以归纳为:用一系列类(classes)试图处理一个请求request,这些类

多级缓存责任链模式。 * client提交给 hander,hander发现责任链上能处理该任务的函数,处理;可以归纳为:用一系列类(classes)试图处 理一个请求request,这些类之间是一个松散的耦合, 唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。

[PHP]代码

<?php

/**
 * \责任链模式,其目的是组织一个对象链处理一个如方法调用的请求。
 * 
 * 最著名的责任链示例:多级缓存。
 * client提交给 hander,hander发现责任链上能处理该任务的函数,处理;
 * 可以归纳为:用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,
 * 唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,
 * 就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
 */

/**
* 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.enbttel'
    )
);
// 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";

/**
 * expect: ...
 * Isaac Asimov
 * Helmut Hei.enbttel
 * 
 * 参与者:

◆Client(客户端):向Handler(处理程序)提交一个请求;
◆Handler(处理程序)抽象:接收一个请求,以某种方式满足它;
◆ConcreteHandlers(具体的处理程序):接收一个请求,设法满足它,如果不成功就委派给下一个处理程序。
 */

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接