设计模式之适配器模式

本文详细阐述了适配器模式的概念,如何通过统一的DatabaseAdapter接口,让不同数据库如Mysql、Psql、Sqllite等无缝对接。通过实例代码展示了如何在项目中实现和使用,提高代码复用性和透明度。
摘要由CSDN通过智能技术生成

什么是适配器模式

通过统一的入口去适配到特定的接口。比如手机充电器,充电器大头会把各种不同的电压转成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();

运行结果

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对这是我的昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值