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;
}
}
?>
<?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>';
}
}
}
?>
<?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>';
}
}
}
?>
<?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