适配器模式 Adapter Pattern

未匹配的标注

定义

将一个接口转换成客户所期望的另一个接口,使接口不兼容的那些类可以一起工作。

设计的原则和思想

  1. 解耦的是目标类(适配器类)和适配者类。
  2. 不变部分是适配者,变化部分是适配器。
  3. 核心思想是将类中原本不兼容的接口转换成兼容的接口。是一种事后的补救策略。

一句话概括设计模式

将接口转换成另一个接口,消除不兼容问题。

适配器模式分三种

  1. 类适配器
  2. 对象适配器
  3. 接口适配器模式(缺省适配器模式)

类适配器和对象适配器

结构中包含的角色

  1. Target(目标抽象类)
  2. Adapter(适配器类)
  3. Adaptee(适配者类)

最小可表达代码

// 目标抽象类
interface Target
{
    public function outputA();
}

// 适配者类
class Adaptee
{
    public function outputB(){}
}

// 类适配器
class ClassAdapter extends Adaptee implements Target 
{  
    public function outputA() 
    {  
        echo '类适配器的业务处理';
    }  
}

// 对象适配器
class ObjectAdapter implements Target 
{  
    private $adaptee;

    public function __construct(Adaptee $adaptee)
    {  
        $this->adaptee = $adaptee;  
    }

    public function outputA()
    {
        echo '对象适配器的业务处理';
    }  
}

(new ClassAdapter())->outputA();
(new ObjectAdapter(new Adaptee))->outputA();

接口适配器模式(缺省适配器模式)

结构中包含的角色

  1. Target(目标抽象类)
  2. DefaultAdapter(默认适配器类)
  3. ConcreteAdapter(具体适配器类)

最小可表达代码

interface Target
{
    public function outputA();
    public function outputB();
}

abstract class DefaultAdapter implements Target
{
    public function outputA(){}
    public function outputB(){}
}

class ConcreteAdapter extends DefaultAdapter
{
    public function outputA() 
    {  
        echo '接口适配器的业务处理';
    }  
}

(new ConcreteAdapter())->outputA();

优点

  1. 可以让任何两个没有关联的类一起运行。
  2. 可以将接口或数据转换代码从程序主要业务逻辑中分离。
  3. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。

缺点

  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
  2. 代码整体复杂度增加。

何时使用

  1. 封装有缺陷的接口设计
  2. 统一多个类的接口设计
  3. 通过接口转换,将一个类插入另一个类系中。
  4. 兼容老版本接口
  5. 适配不同格式的数据
  6. 系统需要使用现有的类,而此类的接口不符合系统的需要。

实际应用场景

  1. 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  2. 在 LINUX 上运行 WINDOWS 程序。

类适配器和对象适配器

类适配器
    这一实现使用了继承机制 : 适配器同时继承两个对象的接口。请注意,这种方式仅能在支持多重继承的编程语言中实现,例如 C++。

对象适配器
    实现时使用了构成原则 : 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 所有流行的编程语言都可以实现适配器。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
发起讨论 只看当前版本


暂无话题~