Design 适配器模式

基本介绍

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。

这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

特点:兼容不同功能接口的2个类,让这2个类都能用相同的方式进行功能调用

案例图示

现在有2种支付方案,AliPay和WechatPay,并且调用支付的方法都不同。

我想实现的是让它们的调用方法通过适配器进行统一,包括后面新加入的支付功能也都用这个统一的接口方法来完成支付。

image-20210412175643728

优缺点

优点:

  • 可以让任何两个没有关联的类一起运行
  • 提高了类的复用
  • 增加了类的透明度
  • 灵活性好

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现

Python实现

用Python实现适配器模式,有2种实现方案,1是多继承,2是组合,下面是使用组合的方式实现:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

class AliPay(object):
    def alipay_api(self, sum):
        print("支付宝支付%s元" % sum)


class WechatPay(object):
    def wechat_pay_api(self, sum):
        print("微信支付%s元" % sum)


# 增加一个适配器
class Adapter(object):
    def __init__(self, pay_mode, pay_method):
        self.pay_mode = pay_mode
        self.pay_method = pay_method
        self.check_pay()

    def pay_api(self, sum):
        func = getattr(self.pay_mode, self.pay_method)
        return func(sum)

    def check_pay(self):
        if not hasattr(self.pay_mode, self.pay_method):
            raise AttributeError("Unsupported payment method:%s" % self.pay_method)


if __name__ == '__main__':
    # 对支付方案套上适配器
    ali_pay = Adapter(AliPay(), "alipay_api")
    wechat_pay = Adapter(WechatPay(), "wechat_pay_api")

    # 使用适配器接口付款
    ali_pay.pay_api(100)
    wechat_pay.pay_api(100)

Golang实现

用Golang实现适配器模式:

...
posted @ 2021-04-12 18:01  云崖君  阅读(63)  评论(0编辑  收藏  举报