设计模式- 适配器模式

适配器模式,将截然不同的函数接口封装成统一的API。实际应用举例,PHP的数据库操作有mysql、mysqli、pdo三种,可以用适配器模式统一。类似的场景还有将memcache、redis、file、apc等不同缓存函数统一成cache适配器。

适用场景:

系统要求使用现有的类,而且这些类的接口不符合系统的接口。

想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

两个类所做的事情相同或相似,但是具有不同接口。

旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有的类。

使用第三方组件,接口定义与我们的定义不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

主要角色:

Target(目标角色):定义客户端使用的与特定领域相关的接口,即我们所期待得到的。

Adaptee(源角色):需要进行适配的接口。

Adapter(适配器角色):对Adaptee的接口与Target接口进行适配。适配是本模式的核心。适配器把原接口转换成目标接口,此角色为具体类。


下面是一个数据库适配器代码模型:

1.Target

Libs/IDatabase.php

<?php
namespace Libs;
/**
* Target
*/
interface IDatabase
{
	function connect($host,$user,$pwd,$dbname);
	function query($sql);
	function close();
}

2.Adapter(对Adaptee进行适配)

Libs/Database/MySQL.php

<?php
namespace Libs\Database;

use Libs\IDatabase;
class MySQL implements IDatabase
{
	protected $conn;		
	public function connect($host,$user,$pwd,$dbname)
	{
                //mysql_connect 是Adaptee
		$conn = mysql_connect($host,$user,$pwd);
		mysql_select_db($dbname);
		$this->conn = $conn;
	}
	public function query($sql)
	{
                //mysql_query<span style="font-family: Arial, Helvetica, sans-serif;">是Adaptee</span>

		$res = mysql_query($sql,$this->conn);
		return $res;
	}
	public function close()
	{
                //mysql_close 是adaptee
		mysql_close($this->conn);
	}
	
}
Libs/Database/MySQLi.php

<?php
namespace Libs\Database;

use Libs\IDatabase;
class MySQLi implements IDatabase
{
	protected $conn;
	
	public function connect($host,$user,$pwd,$dbname)
	{
		$conn = mysqli_connect($host,$user,$pwd,$dbname);
		$this->conn = $conn;
	}
	public function query($sql)
	{
		$res = mysqli_query($this->conn,$sql);
		return $res;
	}
	public function close()
	{
		mysqli_close($this->conn);
	}

}

Libs/Database/PDO.php

<?php
namespace Libs\Database;

use Libs\IDatabase;
class PDO implements IDatabase
{
	protected $conn;

	public function connect($host,$user,$pwd,$dbname)
	{
		$conn =  new \PDO("mysql:host=$host;dbname=$dbname", $user, $pwd);
		$this->conn = $conn;
	}
	public function query($sql)
	{
		return $this->conn->query($sql);	 
	}
	public function close()
	{
		 unset($this->conn);
	}

}


3.调用

$db= new Libs\Database\MySQL();
$db->connect('localhost', 'username', 'pwd', 'test');
$db->query('show databases');
$db->close();


推荐阅读:

设计模式学习笔记-适配器模式

PHP源码阅读,PHP设计模式-胖胖的空间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值