螃蟹学PHP设计模式之模板模式

16.模板模式

貌似可以把模板模式学习一下了。初次接触螃蟹还以为是之前的外观模式的马甲,实则不是这样的。这就好比一台机器,把机器的操作写到一个程序里,让程序来自动控制机器的作业。模板模式就是定义了一系列的操作步骤,后面通过基类拓展的类都使用这些已经定义的步骤来操作,就是像流水线一样的操作,可以很方便的对相同操作的不同对象拓展。

参考项目模块:论坛发帖

螃蟹最近有做关于discuz的开发项目,刚好拿里面的发帖来研究一下模板模式。这个发帖模板肯定不是模板发帖,而是指不同的帖子类型。discuz发帖类型很多,这里螃蟹就使用模板模式简单展示一下多类型发帖的设计。

发帖模板:Posts.template.php

<?php 
abstract class PostsTemplate{
	public $credit = 0; //积分
	public $exp = 0; //经验
	public $check_content = '';
	
	public final function setUP(){
		$this->credit = $this->creditAddition();
		$this->exp = $this->expAddition();
	}
	
	abstract protected function creditAddition();
	
	abstract protected function expAddition();
	
	abstract public function submit();
	
	protected function checkSafe(){
		/*
		 * 检查帖子 check_content
		 */
		return true;
	}
}
?>



普通帖子:Posts.class.php

<?php 
require_once('Posts.template.php');

class Posts extends PostsTemplate{
	
	public $title = '';
	public $content = '';
	
	public function __construct($posts){
		$this->title = $posts['title'];
		$this->content = $posts['content'];
		$this->check_content = $this->title.$this->content;
	}
	
	protected function creditAddition(){
		/**
		 * 积分变化操作,用户组判断等
		 */
		return 2;	
	}
	
	protected function expAddition(){
		/**
		 * 经验变化操作,用户组判断等
		 */
		return 5;
	}
	
	public function submit(){
		if($this->checkSafe()){
			echo $this->title.' 审核通过  '.'已经存储数据-积分+'.$this->creditAddition().' 经验+'.$this->expAddition().'<br>';
		}
	}
	
}
?>



问答帖子:AskPosts.class.php

<?php 
require_once('Posts.template.php');

class AskPosts extends PostsTemplate{
	
	public $title = '';
	public $content = '';
	
	public function __construct($posts){
		$this->title = $posts['title'];
		$this->content = $posts['content'];
		$this->check_content = $this->title.$this->content;
	}
	
	protected function creditAddition(){
		/**
		 * 积分变化操作,用户组判断等
		 */
		return 1;	
	}
	
	protected function expAddition(){
		/**
		 * 经验变化操作,用户组判断等
		 */
		return 10;
	}
	
	public function submit(){
		if($this->checkSafe()){
			echo $this->title.' 审核通过  '.'已经存储数据-积分+'.$this->creditAddition().' 经验+'.$this->expAddition().'<br>';
		}
	}
	
}
?>



测试文件:TestTemplate.php

<?php 
function __autoload($className){
	if(file_exists($className.'.class.php')){
		require_once($className.'.class.php');
	}
}

//模拟帖子
$posts = array('title'=>'今天天气好','content'=>'真好');
$askposts = array('title'=>'今天天气还可以','content'=>'真好吗');

//普通帖子
$postsobj = new Posts($posts);
$postsobj->setUP();
$postsobj->submit();

//问答贴
$askpostsobj = new AskPosts($askposts);
$askpostsobj->setUP();
$askpostsobj->submit();

?>



测试结果:

今天天气好 审核通过 已经存储数据-积分+2 经验+5
今天天气还可以 审核通过 已经存储数据-积分+1 经验+10



而且各个帖子对象还可以自行拓展,通过调用setUP()方法来控制流程。螃蟹其实发现这个模板模式用的还挺不错,特别对于这种行为明确的对象集合创建,如购物,邮件,订单等,都可以很好的处理行为。

你可能感兴趣的:(设计模式,PHP,模板模式)