PHP设计模式之适配、策略以及数据对象映射模式

本文章讲述了php设计模式中的适配器模式、策略模式以及数据对象映射模式;以及每种模式应用实例

PHP设计模式之适配、策略以及数据对象映射模式
一、适配器模式

1、可以将截然不同的函数接口封装成统一的API

2、实际应用举例:PHP的数据库操作有mysql/mysqli/pdo三种,可以用适配器模式统一成一致。

类似的场景还有cache适配器,可以将memcache/redis/file/apc等不同的缓存函数统一成一致的接口。

实例代码:

interface IDataBase{//接口 统一api的方式
   public function connect($host, $user, $pwd, $dbname);
   public function query($sql);
   public function close();
}
class MySQL implements IDataBase{
   protected $conn;
   public function connect($host, $user, $pwd, $dbname){
	$this->conn = mysql_connect($host, $user, $pwd);
	mysql_select_db($dbname, $this->conn);
   }
   public function query($sql){
	$res =mysql_query($sql, $this->conn);
	return $res;
   }
   public function close(){
	mysql_close();
   }
}
class MySQLis implements IDataBase{
   protected $conn;
   public function connect($host, $user, $pwd, $dbname){
	$this->conn = mysqli_connect($host, $user, $pwd, $dbname);
   }
   public function query($sql){
	$res =mysqli_query($this->conn, $sql);
	return $res;
   }
   public function close(){
	mysqli_close($this->conn);
   }
}
class PDOs implements IDataBase{
   protected $conn;
   public function connect($host, $user, $pwd, $dbname){
	$this->conn = new \PDO("mysql://host=$host; dbname=$dbname", $user, $pwd);
   }
   public function query($sql){
	$res = $this->conn->query($sql);
	return $res;
   }
   public function close(){
	unset($this->conn);
   }
}
$db = new MySQLis();
$db->connect('localhost', 'root', 'root', 'test');
$res = $db->query('show tables');
$db->close();
var_dump($res);
二、策略模式:

分支逻辑处理

1、策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境, 这种模式就是策略模式

2、实际应用举例,假如一个电商网站系统,

针对男性女性用户要各自跳转到不同的商品类名,并且所有广告位展示不同的广告,

传统的做法是加入if...else... 判断。如果新增加一种用户类型,只需要新增加一种策略即可

实例代码:

interface Strategy{
   public function showAd();
   public function showCategory();
}
class GrilStrategy implements Strategy{
   public function showAd(){
	echo "新款女装";
   }
   public function showCategory(){
	echo "女装";
   }
}
class BoyStrategy implements Strategy{
   public function showAd(){
	echo "新款男装";
   }
   public function showCategory(){
	echo "男装";
   }
}
class Page{
   protected $strategy;
   public function index(){
	echo "AD:";
	$this->strategy->showAd();
	echo "categray:";
	$this->strategy->showCategory();
   }
   public function setStrategy($strategy){
	$this->strategy = $strategy;
   }
}
$page = new Page();
if (isset($_GET['gril'])) {
   $strategy = new GrilStrategy();
}else{
   $strategy = new BoyStrategy();
}
$page->setStrategy($strategy);
$page->index();
三、数据对象映射模式

1、数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,比我们在代码中new一个对象,那么使用该模式就可以将对对象的一些操作,

比如说我们设置的一些属性,它就会自动保存到数据库,跟数据库中表的一条记录对应起来。

实例,在代码中实现数据对象映射模式,我们将写一个ORM类,将复杂的SQL语句映射成对象属性的操作结合使用数据对象映射模式,工厂模式,注册模式。

2、对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。

从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,

对象关系映射技术应运而生。

简单的说:ORM相当于中继数据。

示例代码:

class MySQLis{
   protected $conn;
   public function connect($host, $user, $pwd, $dbname){
	$this->conn = mysqli_connect($host, $user, $pwd, $dbname);
   }
   public function query($sql){
	$res =mysqli_query($this->conn, $sql);
	return $res;
   }
   public function close(){
	mysqli_close($this->conn);
   }
}
class User{//数据对象模式
   public $id;
   public $name;
   public $tell;
   protected $db;
   public function __construct($id){
	$this->db = new MySQLis();
	$this->db->connect('localhost', 'func', 'passwd', 'test');
	$res = $this->db->query("select * from user where id = {$id} limit 1");
	$data = $res->fetch_assoc();
	$this->id = $data['id'];
	/*$this->id   = $data['id'];
	$this->name = $data['name'];
	$this->tell = $data['tell'];*/
   }
   public function __destruct(){
        $this->db->query("update user set name = '{$this->name}', tell = '{$this->tell}' where id= {$this->id}");
   }
}
class Factory{//工厂模式
   public static function CreateAnimal($name){
   }
   public static function getUser($id){
	$key = "user_{$id}";
	$user = Register::get($key);
	if (!$user) {
		$user = new User($id);
		Register::set($key, $user);
	}
	return $user;
   }
}
class Register {//注册器模式
   protected static $object;
   public static function set($alias, $object){
	self::$object[$alias] = $object;
   }
   public static function get($alias){
	return self::$object[$alias];
   }
   public static function _unset($alias){
 	unset(self::$object[$alias]);
   }
}
class Page{
   public function index(){
	$user = Factory::getUser(1);
	$user->name = 'admin110';
	$this->test();
	echo "ok";
   }
   public function test(){
	$user =  Factory::getUser(1);
	$user->tell = '10010';
   }
}
$page = new Page();
$page->index();
上一篇:PHP设计模式之基础设计模式 下一篇:PHP设计模式之观察者、原型以及装饰模式

评论

评论(0)

暂无评论