设计模式-第十四章 适配模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录



1. 核心思想

将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。换句话说,我们想使用的库可以实现我们的目标,但是调用时不符合我们的规范,所以需要一个适配器,再次开发,写出符合我们规范的接口,方便调用。

适配模式的作用:

  1. 接口转换,将原有的接口(或方法)转换成另一种接口。
  2. 用新的接口包装一个已有的类。
  3. 匹配一个老的组件到一个新的接口。

适配模式又叫变压器模式,也叫包装模式(Wrapper),它的核心思想是:将一个对象经过包装或转换后使它符合指定的接口,使得调用方可以像使用接口的一般对象一样使用它。这一思想在生活中可谓处处可见,除了故事剧情中的插座转换器,具有电压转换功能的变压器插座也有类似的功能,它能让你像使用国标(220V)电器一样使用美标(110V)电器;还有就是各种转接头,如MiniDP转HDMI接头、HDMI转VGA线转换器、MicroUSB转TypeC接头等。

当年,魏文王问名医扁鹊说:“你们家兄弟三人,都精于医术,到底哪一位最好呢?”扁鹊答:“长兄最好,中兄次之,我最差。”文王再问:“那么为什么你最出名呢?”扁鹊答:“长兄治病,是治病于病情发作之前。由于一般人不知道他事先能铲除病因,所以他的名气无法传出去;中兄治病,是治病于病情初起时。一般人以为他只能治轻微的小病,所以他的名气只及本乡里。而我是治病于病情严重之时。一般人都看到我在经脉上穿针管放血、在皮肤上敷药等大手术,所以大家都以为我的医术高明,名气因此响遍全国。”

如果能事先预防接口不同的问题,不匹配问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配。事后控制不如事中控制,事中控制不如事前控制。

适配器模式当然是好模式,但如果无视它的应用场合而盲目使用,其实是本末倒置了。

2. UML类图

适配模式UML类图

3. 框架代码

from abc import ABC, abstractmethod
import sys

class Target(ABC):
    @abstractmethod
    def request(self):
        pass

class Adaptee():
    def specificRequest(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class Adaptor(Target):
    def __init__(self):
      self._adaptee = Adaptee()
    def request(self):
        self._adaptee.specificRequest()

if __name__ == "__main__":
    target = Adaptor()
    # 对客户端来说,调用的就是Target rewuest函数
    target.request()

4. 模型说明

4.1 设计要点

适配模式中主要有三个角色,在设计适配模式时要找到并区分这些角色。

  1. 目标(Target):即你期望的目标接口,要转换成的接口。
  2. 源对象(Adaptee):即要被转换的角色,要把谁转换成目标角色。
  3. 适配器(Adapter):适配模式的核心角色,负责把源对象转换和包装成目标对象。

4.2 优缺点

  • 优点
    1. 可以让两个没有关联的类一起运行,起中间转换的作用。
    2. 提高了类的复用率。
    3. 灵活性好,不会破坏原有系统。
  • 缺点:
    1. 如果原有系统没有设计好(如Target不是抽象类或接口,而是一个实体类),适配模式将很难实现。
    2. 过多地使用适配器,容易使代码结构混乱,如明明看到调用的是A接口,内部调用的却是B接口的实现。

5. 应用场景

  1. 系统需要使用现有的类,而这些类的接口不符合现有系统的要求。
  2. 对已有的系统拓展新功能,尤其适用于在设计良好的系统框架下增加接入第三方的接口或第三方的SDK。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值