设计模式——适配器模式

适配器模式是一种结构型设计模式,用于将不同接口的类进行适配,使得它们能够协同工作。在这个例子中,通过类适配器和对象适配器的方式,实现了印度人、中国人和美国人吃东西方式的接口统一,让这些不同文化的人能以一致的方式享用晚餐。适配器模式在复用已有类并调整其接口以满足新需求的场景中非常有用。
摘要由CSDN通过智能技术生成

结构型模式

适配器模式

定义
  • 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
实现方式
场景:
  1. 需要实现不同国家人吃东西(eat)的接口
  2. 目前有现成的接口:印度人吃东西、美国人吃东西、中国人吃东西,但是各自吃东西的方式不同
from abc import ABC, abstractmethod


class Person(ABC):
    @abstractmethod
    def eat(self, food):
        pass


class Indian:
    def __init__(self, name):
        self.name = name

    def eat_with_hands(self, food):
        print(f"{self.name}来自印度,他习惯通过手来吃东西,今天我们的晚餐是{food}")


class Chinese:
    def __init__(self, name):
        self.name = name

    def eat_with_chopsticks(self, food):
        print(f"{self.name}来自中国,他习惯通过筷子来吃东西,今天我们的晚餐是{food}")


class American:
    def __init__(self, name):
        self.name = name

    def eat_with_knife_and_fork(self, food):
        print(f"{self.name}来自美国,他习惯通刀叉来吃东西,今天我们的晚餐是{food}")
  1. 所以需要一个适配器来将三个国家人吃东西的方式和接口做匹配
1.类适配器:使用继承
class IndianAdapter(Person, Indian):

    def eat(self, food):
        self.eat_with_hands(food)


if __name__ == '__main__':
    i = IndianAdapter("苏什玛·斯瓦拉杰")
    i.eat("火锅")
苏什玛·斯瓦拉杰来自印度,他习惯通过手来吃东西,今天我们的晚餐是火锅
2.对象适配器,使用组合
class ChineseAdapter(Person):
    def __init__(self, target):
        self.target = target
        super().__init__()

    def eat(self, food):
        self.target.eat_with_chopsticks(food)


if __name__ == '__main__':
    c = Chinese("张三")
    i = ChineseAdapter(c)
    i.eat("火锅")
张三来自中国,他习惯通过筷子来吃东西,今天我们的晚餐是火锅
3.反射机制动态处理(不需要再创建多个类)
class Adapter:
    def __init__(self, classname, method):
        self.classname = classname
        self.method = method

    def eat(self, *args):
        getattr(self.classname, self.method)(*args)


if __name__ == '__main__':
    m = American("赫伯特· 乔治· 威尔斯")
    a = Adapter(m, "eat_with_knife_and_fork")
    a.eat("火锅")
赫伯特· 乔治· 威尔斯来自美国,他习惯通刀叉来吃东西,今天我们的晚餐是火锅
角色
  1. 目标接口
  2. 待适配的类
  3. 适配器类
使用场景
  • 复用项目中已存在的类,实现某些功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值