文档章节

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

行走的螃蟹
 行走的螃蟹
发布于 2014/08/15 12:22
字数 704
阅读 78
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

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()方法来控制流程。螃蟹其实发现这个模板模式用的还挺不错,特别对于这种行为明确的对象集合创建,如购物,邮件,订单等,都可以很好的处理行为。

行走的螃蟹

行走的螃蟹

粉丝 32
博文 48
码字总数 23634
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.3K
16
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2
opm-server-mirror

代码更新 2009-11-25: 加入反爬虫功能。直接Web访问服务器将跳转到Google。 使用方法 下载index.zip 解压index.zip得到index.php 将index.php传到支持php和cURL的国外服务器上 打开 http:/...

luosheng86
2013/01/29
1K
0
C++模板库--C++ B-tree

这是一个google开源的C++模板库,实现了基于B-tree数据结构的有序内存容器。类似于STL的map、set、multimap和multiset模板,C++ B-tree也提供了btreemap、btreeset、btreemultimap和btreemu...

匿名
2013/02/05
3.3K
1
N简单CMS

N简单CMS能够让网站开发者更快速、灵活、简单的开发网站。 N简单CMS有以下特点: 更简单和自由的模板标签调用 专注于人性化的管理和操作 基于完全php5框架Kohana2.3.4开发 资源调用和消耗更低...

匿名
2013/02/26
3.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

代理服务器和反向代理服务器之间有什么区别? - What's the difference between proxy server and reverse proxy server?

问题: 代理服务器和反向代理服务器有什么区别? 解决方案: 参考一: https://stackoom.com/question/wRc/代理服务器和反向代理服务器之间有什么区别 参考二: https://oldbug.net/q/wRc/W...

技术盛宴
今天
16
0
第八讲:配置外界可以访问虚拟机里面的HDFS

本节通过配置实现外界访问虚拟机Centos6.4里面的HDFS。为后续的java读写HDFS做准备 步骤有: 1、修改主机Windos7的网络配置 2、修改虚拟机Centos6.4里面的网络配置 3、修改虚拟机Centos6.4里...

刘日辉
今天
26
0
OSChina 周四乱弹 —— 不劳而获的饭好吃么?好吃!非常好吃!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《世界上不存在的歌 (2020重唱版)》- 陈奕迅 《世界上不存在的歌 (2020重唱版)》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
今天
31
3
从 GPU、TPU,到 Web 端、移动端,深度学习框架部署训练开始变简单

本文作者:o****0 早些时候的统计显示,今年3月,深度学习框架集中爆发。5月,有人发布可以直接在 iphone11上训练神经网络的开源项目。日前,百度开源国内首个可直接运行在 Web 端的深度学习...

百度开发者中心
昨天
16
0
如何从Git存储库中删除文件? - How can I delete a file from a Git repository?

问题: I have added a file named "file1.txt" to a Git repository. 我已将名为"file1.txt"的文件添加到Git存储库中。 After that, I committed it, added a couple of directories called......

富含淀粉
今天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部