PHP 之模板模式

我们可能会遇到这种情况,为了实现一些业务逻辑,我们会对同一个对象来回重建进行业务处理

比如说做试卷,老师除了一套试卷,学生们拿到试卷只有两个地方不一样,填写的答案和名字

这样的话,整体的算法骨架是一定的,你只需要固定出来一套题就可以,子类去修改其中一两部

应用情境:数据库中间层的抽象类

上代码

<?php

//模板设计模式创建了一个实施一组方法的抽象对象,子类通常将这个对象作为模板用于自己的设计。
//一般会用于数据库抽象类。
abstract class dbbaseInit{
	/**
     * 抽象数据库链接
     * @param  string $host sql服务器
     * @param  string $user 数据库用户名
     * @param  string $password 数据库登录密码
     * @param  string $database 数据库
     * @param  string $charset 编码
     * @param  string $pconnect 是否持久链接
     */ 

	abstract protected function connect($host,$user,$password,$database,$charset=‘utf-8‘,$pconnect=0);
	/**
     * 抽象数据库执行语句
     * @param  string $sql SQL语句
     * @return obj
     */ 

	abstract protected function query($sql);
	/**
     * 抽象数据库-结果集中的行数
     * @param $result 结果集
     * @return array
     */ 

	abstract protected function result($result,$num=1);

	/**
     * 抽象数据库-从结果集中取得一行作为关联数组
     * @param $result 结果集
     * @return array
     */ 
	//这个方法没用过(不是数字索引而是字段)
	abstract protected function fetch_assoc($result);

	 /**
     * 抽象数据库-从结果集中取得列信息并作为对象返回
     * @param  $result 结果集
     * @return array
     */

     abstract protected function fetch_fields($result);

      /**
     * 抽象数据库-前一次操作影响的记录数
     * @return int
     */ 
      //这个也没有用过
      abstract protected function affected_rows();

     /**
     * 抽象数据库-结果集中的行数
     * @param $result 结果集
     * @return int
     */ 

      abstract protected function num_rows($result);

     /**
     * 抽象数据库-结果集中的字段数量
     * @param $result 结果集
     * @return int
     */ 

     abstract protected function num_fields($result);

     /**
     * 抽象数据库-获取上一INSERT的ID值
     * @return Int
     */ 

     abstract protected function insert_id();

     /**
     * 抽象数据库-释放结果内存
     * @param obj $result 需要释放的对象
     */ 

     abstract protected function free_result($result);

     /**
     * 抽象数据库链接关闭
     * @param  string $sql SQL语句
     * @return obj
     */

     abstract protected function close();

     /**
     * 错误信息
     * @return string
     */ 
     abstract protected function error();

}

//这是具体的某个数据库,比如MySQL,oracle
class mysqliInit extends dbbaseInit{
	public $link_id;
	//重写模型中的连接类
	public function connect($host,$user,$password,$database,$charset=‘utf8‘,pconnect=0){
		$link_id = ($pconnect==0)?mysqli_connect($host,$user,$password):mysqli_pconnect($host,$user,$password);

		if(!$link_id) die(‘mysql connect error!‘);
		mysql_query($link_id,‘set names‘.$charset);
		if(!mysqli_select_db($link_id,$database)) die(‘database is not exist‘);

		return $link_id;
	}

	public function query($sql){
		return mysqli_query($this->link_id,$sql);
	}

	public function result($result,$num=1){
		return mysqli_result($result,$num);
	}

	public function fetch_assoc($result){
		return mysqli_fetch_assoc($result);
	}

	public function fetch_fields($result){
		return mysqli_num_fields($result);
	}

	public function free_result($result){
		return mysqli_free_result($result);
	}

	public function insert_id(){
		return mysqli_insert_id($this->link_id);
	}

	public function affected_rows() { 
        return mysqli_affected_rows($this->link_id); 
    }

    public function close(){
    	if($this->link_id!==null) $mysqli_close($this->link_id);
    	$this->link_id = null;
    	return true;
    }

    public function error(){
    	return mysqli_error($this->link_id);
    }
}
?>

有点累了,设计模式常用的先学到这里,后续的以后再说,

愿法界众生,皆得安乐

时间: 2024-07-31 22:45:53

PHP 之模板模式的相关文章

模板模式

模板模式:解决某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以为这类事情提供一个模板代码,从而提高效率. 模板模式的步骤: 1.先写出解决该类事件中的一件的解决方案. 2.分析代码,把会发生变化的代码抽取出来独立成一个方法.把该方法描述成一个抽象的方法. 3.是用final关键字修饰模板方法,防止别人重写你的模板方法. 例子:需求:编写一个计算程序运行时间的模板. 代码示例: 1 abstract class ProgramRuntime 2 { 3 public final

设计模式之 - 模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个

设计模式整理_模板模式

模板模式在父类中定义了一个方法的模板,而子类可以动态的实现模板成分方法,但是模板中的方法顺序无法改变. 父类中的模板方法往往申明为final,用来保证方法不被子类覆盖,因为作为模板,是不可以改变的,但是模板方法内的一系列方法,可以由子类自己静态实现,同时在父类的模板方法中,可以定义钩子(hook)方法.方便子类对于模板方法的优化.下面用两个例子说明. /*没有钩子(hook)的模板方法,此时模板方法无法修改*/ public abstract class Model { public final

行为模式之Template(模板模式)

模板模式定义一系列的操作流程,并将其中的一个或多个操作的实现延迟到子类之中. 我们以牛奶加工过程为例,当然对其做了简化,具体流程如下图: 首先,将加工过程定义成一个抽象类: AbstractMilkProcess package com.design; /**牛奶加工过程 * @author wobendiankun *2015-1-21 下午08:01:57 */ public abstract class AbstractMilkProcess { /** *挤奶 */ protected

设计模式——模板模式(C++实现)

模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模板模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势. 通过继承和多态来实现. 行为型模式. spp业务框架中的server_task(CServerTask类)就是这么一个东西.非常常用的一个模式. 使用场景: 1.有多个子类共有的方法,且逻辑相同. 2.重要的.复杂的方法,可以考虑作为模板方法. 1 #include <iostream>

设计模式(7)--模板模式

//7.模板模式 //ver1 //考试试卷类 class TestPaper { public: void TestQuestion1(){} void TestQuestion2(){} virtual string Answer1() { return ""; } virtual string Answer2() { return ""; } }; class TestPaperA : public TestPaper { public: void TestQ

模板模式讲解二

一.何为模板 在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 二.模式结构设计 父类定义成一个抽象类,有一个具体实现方法,在这个具体实现方法会去调用此抽象类定义的抽象方法,这些抽象方法由子类继承实现,因为

咸蛋系列一●《模板模式构建随机对象生成》2 构思

随机对象生成可以说是随机数生成的一个延伸,在实际使用中,我们可能要生成的不是一个简简单单的数字,而是像数字.大小写字符.中文汉字.算数表达式等. 由于其实现相对简单,取各种随机对象的源码网上也比比皆是,因而貌似也没人做一个通用的.可扩展的随机对象生成. 博主要不是因为闲得蛋疼也是不会想到做这个东西的,好了,言归正传.分析随机对象生成,其要点无外乎三点: 1. 设置随机对象集: 2. 获取一个或多个随机对象: 3. 获取一个或多个不重复随机对象: 在这三点中,后两者算法皆固定,仅设置对象集不同,故

引入模板模式重构FtpClientUtil

在<ftp上传与下载>文章中,封装一个Ftp上传下载的工具类,主要代码如下: 上传: /**上传文件 * @param remoteFileName 远程文件名称 * @param locaFileName 本地文件名称 */ public void upload(String remoteFileName,String locaFileName){ FTPClient ftp=null; try { ftp = new FTPClient(); ftp.addProtocolCommandL

【设计模式】模板模式

引子 这是一个很简单的模式,却被非常广泛的使用. 之所以简单是因为在这个模式中仅仅使用到了继承关系. 继承关系由于自身的缺陷,被专家们扣上了“罪恶”的帽子. “使用委派关系代替继承关系”, “尽量使用接口实现而不是抽象类继承”等等专家警告,让我们大家对继承“另眼相看”. 其实,继承还是有很多自身的优点所在.只是被大家滥用的似乎缺点更加明显了. 合理的利用继承关系,还是能对你的系统设计起到很好的作用的. 而模板方法模式就是其中的一个使用范例. 定义与结构 模板方法(Template Method)