您的位置:首页 > 编程语言 > PHP开发

PHP设计模式-模板模式(模板方法模式)

2014-02-02 16:24 441 查看
        模板模式,也叫模板方法模式。它主要是利用继承的方法覆盖。在工厂模式系列中,我们就有讲到工厂方法模式利用的就是子类在继承父类时,将指定方法覆盖以实现不同子类的功能。我们来回顾一下,有一个生产玩具的工厂,他们都有生产玩具的能力,他们有三个车间生产不同的玩具,分别为熊玩具,狗玩具,猫玩具。每种玩具的生产方式和流程不一样。那么,如何设计?轻车熟路,首先我们有个玩具车间的抽象类,它指明各车间有生产玩具的能力(make()方法)。

abstract class Factory {

abstract public function make();
}

class BearFactory extends Factory {

public function make()
{
echo "生产熊玩具".PHP_EOL;
}
}

class CatFactory extends Factory {

public function make()
{
echo “生产狗玩具”.PHP_EOL;
}
}

class DogFactory extends Factory {

public function make()
{
echo "生产狗玩具".PHP_EOL;
}
}        以上便是一个简单的模块方法模式。尽管在设计模式中,大家一味得提倡少用继承,多用组合。针对接口编程。但继承应用到位还是可以起到事半功倍的效果的。有人说,这个例子也太简单了吧。实际中,如何利用这种特征呢?我曾经利用这个设计模式写了一个缓存类。我把涉及到模板方法的部分,拿出来与大家分享一下。需求是这样的:在业务流程中,经常要查询一些类型信息和标签信息。暂且可以不用管它是什么样的类型和标签。只知道这些数据存在数据库的不同表中,且不经常改变。但读取得很频繁,于是决定,写个缓存把这些信息缓存下来,每隔一段时间更新一次。首先,要抽象出一个缓存类。有一个能更新的方法(update()),一个判断缓存是否可用的方法(isValid())和查询信息的方法(get())。
abstract class Cache {

//缓存的名字
protected $_cacheName;

//缓存的数据存在这里
protected $_dataList;

//更新缓存内容
abstract public function update();

//缓存是否可用
abstract public function isValid();

//从缓存中读取数据
abstract public function get($name);

//查询缓存
public function query($name)
{
//如果缓存不存丰,或者失效,则重新生成缓存
if (!$this->isValid()) {
$this->update();
}
return $this->get($name);
}
}
        从这个抽象类我们看到,如果要调用query()查询信息,可能会用到isValid(), update(), get()这三个方法。所以在抽象类中,定义了这三个抽象方法,子类根据自己的实际情况只需要实现这三个方法就可以了。假如我把Tag存到文件中,把Cache存在memcache中,那么(具体代码省略):
class TagCache extends Cache {

public function __construct()
{
//建立存储有效期时间的meta文件及数据缓存文件
}

public function update()
{
//从tag数据库表中更新Tag信息
}

public function isValid()
{
//建立一个meta文件,存储Tag缓存的有效时间等信息,
//meta文件中有效期时间小于当前时间返回false
}

public function get($name)
{
//从根据name从缓存文件中读取所需的信息
}
}

class TypeCache extends Cache
{

public function __construct()
{
//初始化memcache连接
}

public function update()
{
//从type数据库表中读取数据,并更新memcache
}

public function isValid()
{
//将有效时间存入memcache中。
//有效时间小于当前时间返回false
}

public function get($name)
{
//从memcache中读取所需的信息
}
}    从上面例子可以看出,两种缓存无论是在更新,判断有效性,及读取数据的方式均不一样。但按照抽象类定义的模板方面分别实现。这样query()方法就不用关心子类的细节了。同时,我们可以想到,可以用什么方法来生成不同的缓存?对,就是工厂模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: