极简设计模式-适配器模式

适配器模式 - 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++。

对象适配器
    实现时使用了构成原则 : 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 所有流行的编程语言都可以实现适配器。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!