手记

【九月打卡】第5天--大话PHP设计模式第六章节适配器模式

课程名称:大话PHP设计模式

课程章节: 6-1适配器模式

主讲老师:Rango

课程内容

课程主要介绍了适配器的定义及其简单的实现案例,通过自我扩展,更加深入的了解其中的原理和优缺点。

课程收获

一、适配器模式定义

适配器模式(Adapter Pattern)将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器。

二、适配器模式结构

1.Target(目标抽象类)

目标抽象类定义客户要用的特定领域的接口,可以是个抽象类或接口,也可以是具体类;在类适配器中,由于php语句不支持多重继承,因此它只能是接口。

2.Adapter(适配器类)

适配器类可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配器模式的核心,在类适配器模式中,它通过实现Target接口并继承Adaptee类来使两者产生联系;在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。

3.Adaptee(适配者类)

适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有是适配者类的源代码。

4.Client(客户类)

在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。

三、优缺点

1.优点

将目标类和适配者类解耦,通过引入一个适配者类来重用现有的适配者类,而无须修改原有代码

增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。

灵活性和扩展性都非常好,完全符合“开闭原则”。

类适配器的优点:由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

对象适配器的优点:对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配器类和它的子类都适配到目标接口。

2.缺点

类适配器:PHP不支持多重继承,目标抽象类只能是接口,使用具有一定的局限性。
对象适配器:与类适配器模式相比,置换适配者类的方法不容易。

四、代码案例

1.MYSQL连接

interface IDatabase
{
    function connect($host,$user,$password,$dbname);
    function query($sql);
    function close();
}

class MySQL implements IDatabase
{
    protected $conn;
    function connect($host,$user,$password,$dbname)
    {
        $conn = mysql_connect($host,$user,$password);
        mysql_select_db($dbname,$conn);
        $this->conn = $conn;
    }

    function query($sql)
    {
        $res = mysql_query($sql);
        return $res;
    }

    function close()
    {
        mysql_close($this->conn);
    }
}

$db = new MySQL;
$db->connect('127.0.0.1','root','root','test');
$db->query("show databases");
$db->close();

2.MYSQLI连接

interface IDatabase
{
    function connect($host,$user,$password,$dbname);
    function query($sql);
    function close();
}

class MySQLi implements IDatabase
{
    protected $conn;
    function connect($host,$user,$password,$dbname)
    {
        $conn = mysqli_connect($host,$user,$password,$dbname);
        $this->conn = $conn;
    }

    function query($sql)
    {
        $res = mysqli_query($this->conn,$sql);
        return $res;
    }

    function close()
    {
        mysqli_close($this->conn);
    }
}

$db = new MySQLi;
$db->connect('127.0.0.1','root','root','test');
$db->query("show databases");
$db->close();

3.PDO连接

interface IDatabase
{
    function connect($host,$user,$password,$dbname);
    function query($sql);
    function close();
}

class PDOS implements IDatabase
{
    protected $conn;
    function connect($host,$user,$password,$dbname)
    {
        $conn = new PDO("mysql:host=$host;dbname=$dbname",$user,$password);
        $this->conn = $conn;
    }

    function query($sql)
    {
        return $this->conn->query($sql);
    }

    function close()
    {
        unset($this->conn);
    }
}

$db = new PDOS;
$db->connect('127.0.0.1','root','root','test');
$db->query("show databases");
$db->close();


五、课程截图


0人推荐
随时随地看视频
慕课网APP