什么是适配器模式
通过统一的入口去适配到特定的接口。比如手机充电器,充电器大头会把各种不同的电压转成5v的电压,以此达到安全的给手机充电的目的。
使用场景
比如数据库的配置,你可能在项目中用到了多种数据库,像Mysql、Psql、Sqllite、Oracle等,他们有不同的连接方式和查询方式,此时就非常适合用适配器模式,使用一个统一的入口来调用它们。
优点
可以让任何两个没有关联的类一起运行。 提高了类的复用。 增加了类的透明度。灵活性好。
示意图
代码实例
首先看下目录结构:
DatabaseAdapter.php定义了适配器类需要实现的方法,依此来实现统一标准
<?php
interface DatabaseAdapter{
/**
* 连接数据库
* @param $host
* @param $username
* @param $password
* @param $database
* @return mixed
*/
public function connect($host,$username,$password,$database);
/**
* 执行sql语句
* @return mixed
*/
public function query();
/**
* 关闭数据库
* @return mixed
*/
public function close();
}
MysqlAdapter.php 实现了Mysql数据库的连接、查询、关闭
<?php
class MysqlAdapter implements DatabaseAdapter{
public function connect($host, $username, $password, $database)
{
// TODO: Implement connect() method.
return 'Mysql数据库已连接';
}
public function query()
{
// TODO: Implement query() method.
return 'Mysql已查询';
}
public function close()
{
// TODO: Implement close() method.
return 'Mysql数据库连接已关闭';
}
}
PsqlAdapter.php 实现了Psql数据库的连接、查询、关闭
<?php
class PsqlAdapter implements DatabaseAdapter{
public function connect($host, $username, $password, $database)
{
// TODO: Implement connect() method.
return 'Psql数据库已连接';
}
public function query()
{
// TODO: Implement query() method.
return 'Psql已查询';
}
public function close()
{
// TODO: Implement close() method.
return 'Psql数据库连接已关闭';
}
}
SqlliteAdapter.php 实现了Sqllite数据库的连接、查询、关闭
<?php
class SqlliteAdapter implements DatabaseAdapter{
public function connect($host, $username, $password, $database)
{
// TODO: Implement connect() method.
return 'Sqllite数据库已连接';
}
public function query()
{
// TODO: Implement query() method.
return 'Sqllite已查询';
}
public function close()
{
// TODO: Implement close() method.
return 'Sqllite数据库连接已关闭';
}
}
Database.php 适配器的统一入口,通过构造函数设置要配置的数据库类
<?php
class Database implements DatabaseAdapter{
protected $_adapter;
public function __construct($adapter)
{
$className = $adapter."Adapter";
$this->_adapter = new $className();
}
public function connect($host, $username, $password, $database)
{
// TODO: Implement connect() method.
echo "<h3>".$this->_adapter->connect($host,$username,$password,$database)."</h3>";
}
public function query()
{
// TODO: Implement query() method.
echo "<h3>".$this->_adapter->query()."</h3>";
}
public function close()
{
// TODO: Implement close() method.
echo "<h3>".$this->_adapter->close()."</h3>";
}
}
Client.php 用户使用方法
<?php
require_once 'DatabaseAdapter.php';
require_once 'Database.php';
require_once 'MysqlAdapter.php';
require_once 'PsqlAdapter.php';
require_once 'SqlliteAdapter.php';
//适配Mysql
$database = new Database('Mysql');
$database->connect('127.0.0.1','root','root','test');
$database->query();
$database->close();
echo "分割线---------------------------------------------------------------";
//适配Psql
$database = new Database('Psql');
$database->connect('127.0.0.1','root','root','test');
$database->query();
$database->close();
echo "分割线---------------------------------------------------------------";
//适配Sqllite
$database = new Database('Sqllite');
$database->connect('127.0.0.1','root','root','test');
$database->query();
$database->close();
运行结果