以下是有关高速缓存代理设计模式的问题。
是否可以使用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做些什么吗?你知道它是否是标准模式吗?你会如何实现它?
需要
我认为PHPUnit使用Mock系统做了类似的事情......
答案 0 :(得分:0)
您可以将装饰器模式与委托一起使用,并创建一个接受任何对象的缓存装饰器,然后在通过缓存运行它之后委托所有调用。
这有意义吗?