使用PHP自动对象缓存代理

时间:2014-02-14 17:15:49

标签: oop caching design-patterns proxy

以下是有关高速缓存代理设计模式的问题。

是否可以使用PHP创建动态代理缓存实现,以自动将缓存行为添加到任何对象?

这是一个例子

class User
{
    public function load($login)
    {
        // Load user from db 
    }

    public function getBillingRecords()
    {
        // a very heavy request
    }

    public function computeStatistics()
    {
        // a very heavy computing
    }
}

class Report
{
    protected $_user = null;

    public function __construct(User $user)
    {
        $this->_user = $user;
    }

    public function generate()
    {
        $billing = $this->_user->getBillingRecords();
        $stats = $this->_user->computeStatistics();

        /* 
            ...
            Some rendering, and additionnal processing code
            ...
        */
    }
}

您会注意到该报告将使用User中的一些重载方法。

现在我想添加一个缓存系统。 我只是想知道是否可以在代理设计模式中实现缓存系统,而不是设计这种用法:

<?php
$cache = new Cache(new Memcache(...));

// This line will create an object User (or from a child class of User ex: UserProxy)
// each call to a method specified in 3rd argument will use the configured cache system in 2
$user = ProxyCache::create("User", $cache, array('getBillingRecords', 'computeStatistics'));
$user->load('johndoe');

// user is an instance of User (or a child class) so the contract is respected
$report = new report($user)
$report->generate(); // long execution time
$report->generate(); // quick execution time (using cache)
$report->generate(); // quick execution time (using cache)

对proxyfied方法的每次调用都将运行如下:

<?php
$key = $this->_getCacheKey();
if ($this->_cache->exists($key) == false)
{
    $records = $this->_originalObject->getBillingRecords();
    $this->_cache->save($key, $records);
}

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

您认为我们可以用PHP做些什么吗?你知道它是否是标准模式吗?你会如何实现它?

需要

  • 动态实现原始对象的新子类<​​/ li>
  • 用缓存的
  • 替换指定的原始方法
  • 实现一种新的此类对象

我认为PHPUnit使用Mock系统做了类似的事情......

1 个答案:

答案 0 :(得分:0)

您可以将装饰器模式与委托一起使用,并创建一个接受任何对象的缓存装饰器,然后在通过缓存运行它之后委托所有调用。

这有意义吗?