Design 适配器模式
基本介绍
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。
这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
特点:兼容不同功能接口的2个类,让这2个类都能用相同的方式进行功能调用
案例图示
现在有2种支付方案,AliPay和WechatPay,并且调用支付的方法都不同。
我想实现的是让它们的调用方法通过适配器进行统一,包括后面新加入的支付功能也都用这个统一的接口方法来完成支付。
优缺点
优点:
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用
- 增加了类的透明度
- 灵活性好
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 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实现适配器模式:
...