适配器模式没有使用适配器接口?

时间:2017-07-12 02:52:06

标签: php oop design-patterns

我正在读一本介绍适配器模式使用的书。它说适配器模式经常在Web项目中用作一种使用方式 数据库API(例如PDO或mysqli)没有将页面反复耦合到该数据库API。以下是示例代码:

interface DatabaseAdapterInterface
{
 function setConnectionInfo($values=array());
 function closeConnection();
 function runQuery($sql, $parameters=array());
 function fetchField($sql, $parameters=array());
 function fetchRow($sql, $parameters=array());
 function fetchAsArray($sql, $parameters=array());    
 function insert($tableName, $parameters=array());
 function beginTransaction();
 function commit();
 function rollBack();
 //many other methods
}

class DatabaseAdapterPDO implements DatabaseAdapterInterface
{
 //implements all the methods in the DatabaseAdapterInterface
 }

 class DatabaseAdapterMySQLi implements DatabaseAdapterInterface
 {
 //...implements all the methods in the DatabaseAdapterInterface
 }

任何客户端类(或页面) 需要使用数据库将通过具体的适配器来实现:

$connect = array(DBCONNECTION, DBUSER, DBPASS);
$adapter = new DatabaseAdapterPDO($connect);
$sql = 'SELECT * FROM ArtWorks WHERE ArtWorkId=?';
$results = $adapter->runQuery($sql, array(5));

虽然此示例代码显然不包含PDO代码,但它并不完全免费 从依赖到我们的数据库API。

我明白了,但我不知道为什么我们需要拥有DatabaseAdapterInterface?我们可以在不使用DatabaseAdapterInterface的情况下定义DatabaseAdapterPDO和DatabaseAdapterMySQLi中的所有方法,我们可以节省一些代码来编写DatabaseAdapterInterface,我们可以吗?或者使用DatabaseAdapterInterface可以强制程序员实现所需的方法,以便程序员不会错过任何所需的方法?

1 个答案:

答案 0 :(得分:-1)

你读过的那本书是错误的。

当您针对现有API进行编码然后想要切换时,将使用适配器模式。您接下来要做的是创建模仿旧API的类,以便您可以使用新库而无需更改整个代码库。

您创建的类通常称为包装类。

常规接口用于定义API,以便任何人都可以实现它,从而避免使用适配器模式。

区别在于目的。适配器用于解决两个库具有不同API的问题,而无需重写整个应用程序。接口用于声明API。