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

        模板模式,也叫模板方法模式。它主要是利用继承的方法覆盖。在工厂模式系列中,我们就有讲到工厂方法模式利用的就是子类在继承父类时,将指定方法覆盖以实现不同子类的功能。我们来回顾一下,有一个生产玩具的工厂,他们都有生产玩具的能力,他们有三个车间生产不同的玩具,分别为熊玩具,狗玩具,猫玩具。每种玩具的生产方式和流程不一样。那么,如何设计?轻车熟路,首先我们有个玩具车间的抽象类,它指明各车间有生产玩具的能力(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()方法就不用关心子类的细节了。同时,我们可以想到,可以用什么方法来生成不同的缓存?对,就是工厂模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值