适配器模式
内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两种实现方式:
类适配器:使用多继承
对象适配器:使用组合
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
# abstract class
@abstractmethod
def pay(self, money):
pass
class Alipay(Payment):
def pay(self, money):
print("支付宝支付%d元." % money)
class WechatPay(Payment):
def pay(self, money):
print("微信支付%d元." % money)
class BankPay:
def cost(self, money):
print("银联支付%d元." % money)
class ApplePay:
def cost(self, money):
print("苹果支付%d元." % money)
# # 类适配器
# class NewBankPay(Payment, BankPay):
# def pay(self, money):
# self.cost(money)
# 对象适配器
class PaymentAdapter(Payment):
def __init__(self, payment):
self.payment = payment
def pay(self, money):
self.payment.cost(money)
p = PaymentAdapter(BankPay())
p.pay(100)
# 组合
# class A:
# pass
#
# class B:
# def __init__(self):
# self.a = A()
角色:
目标接口(Target)
待适配的类(Adaptee)
适配器(Adapter)
适用场景:
想使用一个已经存在的类,而它的接口不符合你的要求
(对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
桥模式
内容:
将一个事物的两个维度分离,使其都可以独立地变化。
角色:
抽象(Abstraction)
细化抽象(RefinedAbstraction)
实现者(Implementor)
具体实现者(ConcreteImplementor)
应用场景:
当事物有两个维度上的表现,两个维度都可能扩展时。
优点:
抽象和实现相分离
优秀的扩展能力
![]()
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
def __init__(self, color):
self.color = color
@abstractmethod
def draw(self):
pass
class Color(metaclass=ABCMeta):
@abstractmethod
def paint(self, shape):
pass
class Rectangle(Shape):
name = "长方形"
def draw(self):
# 长方形逻辑
self.color.paint(self)
class Circle(Shape):
name = "圆形"
def draw(self):
# 圆形逻辑
self.color.paint(self)
class Line(Shape):
name = "直线"
def draw(self):
# 直线逻辑
self.color.paint(self)
class Red(Color):
def paint(self, shape):
print("红色的%s" % shape.name)
class Green(Color):
def paint(self, shape):
print("绿色的%s" % shape.name)
class Blue(Color):
def paint(self, shape):
print("蓝色的%s" % shape.name)
shape = Line(Blue())
shape.draw()
shape2 = Circle(Green())
shape2.draw()
bridge