Python设计模式中的结构型适配器模式

目录
  • 一、适配器模式
  • 二、应用场景
  • 三、代码示例
    • 方式一
    • 方式二

一、适配器模式

适配器,顾名思义是一种万能的接口,达到万能转换的效果。

适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。

二、应用场景

三、代码示例

实体角色:

目标接口(Target):定义提供给 Client 访问的接口,可以是一个抽象类或接口,也可以是具体类。
待适配的类 / 适配者类(Adaptee):被适配的角色,它们已经存在了一些接口,是 Client 希望的业务方法,这些接口需要被适配。
适配器(Adapter):作为一个转换器,对 Adaptee Target 进行适配。

方式一

import abc

class Mobile(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def call(self):
        pass

class Xiaomi(Mobile):
    # 目标接口
    def call(self):
        print(f"使用{self.__class__.__name__}打电话")

class Huawei(Mobile):
    # 目标接口
    def call(self):
        print(f"使用{self.__class__.__name__}打电话")

# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Iphone:

    def dial(self):
        print(f"使用{self.__class__.__name__}打电话")

# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Chuizi:

    def dial(self):
        print(f"使用{self.__class__.__name__}打电话")

# 适配器,使得新的手机品牌打电话接口与旧的适配
class MobileAdapter(Mobile):

    def __init__(self, mobile):
        self.mobile = mobile

    def call(self):
        self.mobile.dial()

if __name__ == "__main__":
    xiaomi = Xiaomi()
    xiaomi.call()

    huawei = Huawei()
    huawei.call()

    iphone = MobileAdapter(Iphone())
    iphone.call()

    chuizi = MobileAdapter(Chuizi())
    chuizi.call()

方式二

适配器类通过__dict__ 将需要转化的类的方法注册到适配器,重载 __getattr__ 使其在适配器函数查无方法的时候,执行 getattr 方法。

class A:
    def a(self):
        print("我是A类的a方法")

class B:
    def b(self):
        print("我是B类的b方法")

class C:
    def c(self):
        print("我是C类的c方法")

class Adapter:

    def __init__(self, classname, method):
        self.classname = classname
        self.__dict__update = method
    def __getattr__(self, attr):
        return getattr(self.classname, attr)

def test():
    objects = []
    AA = A()
    objects.append(Adapter(AA, dict(test=AA.a)))
    BB = B()
    objects.append(Adapter(BB, dict(test=BB.b)))
    CC = C()
    objects.append(Adapter(CC, dict(test=CC.c)))
    for obj in objects:
        obj.test()

test()

到此这篇关于Python设计中的结构型适配器模式的文章就介绍到这了,更多相关Python适配器模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python设计模式之适配器模式原理与用法详解

    本文实例讲述了Python设计模式之适配器模式原理与用法.分享给大家供大家参考,具体如下: 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配器模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式--适配器模式 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一

  • Python设计模式编程中Adapter适配器模式的使用实例

    将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:希望复用一些现存的类,但是接口又与复用环境要求不一致. 模式特点:将一个类的接口转换成为客户希望的另外一个接口. 分类:类适配器(通过多重继承).对象适配器. 来通过例子说明,下面是用户通过适配器使用一个类的方法 class Target: def Request(): print "common request." class Adaptee(Target): def S

  • python 最简单的实现适配器设计模式的示例

    适配器设计模式是懒得改动某些代码,或者某些接口不方便改动的时候,使用一个特定的封装,一些特定的编写办法,使不同的接口可以使用同种调用方式使用. 更简单的说话则是,例如几个不同的接口 aliyun.qiniuyun.tencentyun是新增的接口,以前都是使用接口yun进行文件备份,现在每一种调用不同名都太烦,统一使用yun去进行aliyun.qiniuyun.tencentyun上传文件.这个时候就需要写一个适配器. 现在看一个简单例子,有一个类为Upload 是一个上传类,里面有一个方法是y

  • Python设计模式中的结构型适配器模式

    目录 一.适配器模式 二.应用场景 三.代码示例 方式一 方式二 一.适配器模式 适配器,顾名思义是一种万能的接口,达到万能转换的效果. 适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作. 二.应用场景 三.代码示例 实体角色: 目标接口(Target):定义提供给 Client 访问的接口,可以是一个抽象类或接口,也可以是具体类.待适配的类 / 适配者类(Adaptee):被适配的角色,它们

  • Python设计模式中的结构型桥接模式

    目录 一.桥接模式 二.应用场景 三.代码示例 一.桥接模式 桥接模式,希望能够将一个事物的两个维度分离(解耦),使其都可以独立地变化,并通过桥梁连接起来. (类)抽象部分(Abstraction):存在于多个实体中的共同的概念性联系,就是抽象化.作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待. (对象)实体部分(Implementation):抽象化给出的具体实现,就是实现化. 简而言之,桥接模式就是指在一个软件系统的抽象化和实现化之间,使用组合/聚合关系而不是继承关

  • 结合ES6 编写 JavaScript 设计模式中的结构型模式

    目录 前言 什么是设计模式? 结构型设计模式 适配器模式 实例 桥接模式 实例 组合模式 实例 装饰者模式 实例 门面模式 实例 享元模式 实例 代理模式 实例 前言 本文将对 20 多种 JavaScript 设计模式进行简单概述,然后结合 ES6 类的方式来编写实例代码展示其使用方式. JavaScript 在现代前端中扮演重要的角色,相比过去能够做的事情已经不在一个级别上了.JavaScript 最大的特征是其灵活性,一般只要敢想敢写,可以把程序写得很简单,有可以写得很复杂.其灵活性导致编

  • Python设计模式中的创建型工厂模式

    目录 一.工厂模式(Factory Pattern) 二.应用场景 三.编码示例 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 一.工厂模式(Factory Pattern) 工厂模式(Factory Pattern),提供了一种实例化(创建)对象的最佳方式. 在工厂模式中,首先定义了一个抽象的工厂类(class Factory),并且在该工厂类中定义了提供了一个通用的.用于实例化对象的 Interface(接口)函数.然后当 Client 想要实例化某个具体的类的对象时,只需要将需求告

  • Python 设计模式中命令模式

    目录 1.命令模式 2.应用场景 3.代码示例 1.命令模式 命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者). 命令模式的思路是在调用者和接收者之间插入一个命令类(Command),该命令类定义了一个 execute 接口,并且该接口实际上是调用了接收者中的具体方法来执行具体命令,以此可以通过扩展命令子类来扩展多个不同的接收者. 这样调用此命令的调用者就和命令接收者之间解耦了. 优势: 封装性好,每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需

  • Python设计模式中的行为型策略模式

    目录 一.策略模式 二.应用场景 三.代码示例 一.策略模式 策略模式中,首先定义了一系列不同的算法,并把它们一一封装起来,然后在策略类中,使这些算法可以相互替换.这意味着,让一个类的行为(算法)可以在类的实例化对象运行时进行更改. 优点: 定义了一系列可重用的算法和行为. 消除了一些条件语句. 可以提供相同行为的不同实现. 缺点: Client 必须了解不同的策略行为细节. 二.应用场景 根据不同的客户属性,采用不同的折扣策略来计算订单中的商品价格: 有 1000 或以上积分的客户,每个订单享

  • Python 设计模式中的创建型建造者模式

    目录 一.建造者模式 二.代码示例 一.建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)来进行建筑的修建.对于千差万别的建筑,都可以复用同样的施工流程.因为不同的材料.不同设计,可以有不同的表现. 建造者模式,与抽象工厂模式同样用于实例化复杂的对象,主要区别在于: 抽象工厂模式侧重于实例化多个系列的复杂对象. 建造者模式侧重于一步步有序地构造一个复杂对象. 二.代码示例 按照有序的步骤来组装(建造)一个复杂

  • 简介Python设计模式中的代理模式与模板方法模式编程

    代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问.比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 python的例子 你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办? class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其实本质上就是属

  • Python设计模式中单例模式的实现及在Tornado中的应用

    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__(cls, *args) return cls._instance 但是子类在继承后可以重写__new__以失去单例特性 class D(Singleto

  • Python设计模式中的备忘录模式

    目录 备忘录模式 应用场景 代码示例 总结 备忘录模式 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单来说,就是在运行过程中我们可以记录某个状态,当遇到错误时恢复当前状态,这在业务流程中是用设计来处理异常情况. 优点: 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取.这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界.

随机推荐