趣谈设计模式之桥接模式

桥接模式

原理是基于面向对象的多态特性 基于类的最小设计原则 使用封装、聚合和继承等行为将抽象部分和实现部分解耦(这里的实现部分并不是具体的实现类,而是一个具体实现类的接口,抽象类的操作都会委托给具体实现类执行) 使得它们可以独立变化互不影响 它们之间通过一个桥梁接口联系

桥接模式实现步骤
  • 定义抽象类和实现类接口
  • 定义桥梁接口:包含了一个对实现类的引用 以及一些委托方法
  • 定义具体桥梁类:继承桥梁接口,实现了委托方法,将调用转发给实现类的方法
  • 实例化具体桥梁类 并将实现类对象作为参数传递给具体桥梁类的构造函数
  • 调用具体桥梁类的方法:桥梁类将委托给实现类的方法来完成具体的操作
桥接模式的四种角色
  • 抽象类: 该类包含一个对实现类角色的引用, 抽象角色中的方法一般需要实现角色实现。
  • 修正对象:抽象类的具体实现类
  • 实现类:提供给抽象类使用,一般为接口或者抽象类
  • 实现类的具体实现
虚构故事

比如我们平时点外卖,平台给派单,骑实不用关心他送的是什么外卖,他只需要负责把外卖按时送到顾客手里就算完成了任务。 在这个例子中,有几个角色: 商家、外卖骑手、顾客。对于商家来说,并不关心哪个骑手配送他家的外卖,商家只需要打包好外卖,等骑手过来领取; 商家和顾客之间是通过外卖小哥间接接触的,那我们可以将这个逻辑关系抽象出来。 我们我们暂时只关注商家和骑手,不用关注顾客订餐的细节。

于是我们杜撰出一个超级大杂烩平台,且虚构出一个胡扯的故事…

商家&外卖骑手的UML类图如下
# 实现类接口
class DeliveryMan(ABC):
    platform = None

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

    @abstractmethod
    def send(self, food, customer):
        pass


class MeituanDeliveryMan(DeliveryMan):
    platform = "某团"

    def send(self, food, customer):
        print(f"\t[{self.platform}]-外卖骑手-({self.name})正在配送: (客户-{customer}) 点的 {food}.")


# 抽象类
class Business(ABC):
    """ 外卖商家-接口"""
    platform = None

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

    @abstractmethod
    def delivery(self, food: str, deliveryman: DeliveryMan, customer: str):
        """ 商家只负责做饭"""
        pass


class MeituanBusiness(Business):
    """ 某团商家"""
    platform = "某团"

    def delivery(self, food: str, deliveryman: DeliveryMan,  customer: str):
        print(f"{self.platform}-商家[{self.name}] 委托:")
        deliveryman.send(food, customer)

if __name__ == "__main__":
    # 小马哥点了一杯奶茶  商家委托骑手(bridge)送外卖到顾客手里
    business1 = MeituanBusiness("霸王奶茶")
    delivery1 = MeituanDeliveryMan("张全蛋")
    business1.delivery("伯牙琴弦", delivery1, "小马哥")

某团-商家[霸王奶茶] 委托:
	[某团]-外卖骑手-(张全蛋)正在配送: (客户-小马哥) 点的 伯牙琴弦.

一个夏日的午后 小马哥在连线投资部的会议前在某团平台点了一杯奶茶
某团将这单派送了附近的骑手张全蛋

1h later…
张全蛋:(气喘吁吁) 马总,不好意思 路上有点堵,您的奶茶送慢了
小马哥:你这送奶茶的速度比我们TX开会还慢啊
张全蛋:(挠头)马总,真的不好意思,刚才有个大妈非要让我帮她修手机,我一时好心就耽误了点时间
小马哥:(无奈)行了,你这服务态度倒是不错,就是效率有点感人。这奶茶都凉了,我这人最讲究“趁热喝”,你这是让我喝“冷知识”啊
张全蛋:(尴尬)马总,我下次一定快点,保证让您喝到热乎的!

小马哥喝着奶茶突然冒出了一个大胆的想法… 给战略合作伙伴JD的东哥拨通了电话…
小马哥:(拿起电话,语气兴奋)喂,老刘啊,你JD物流这么强,为什么不搞外卖?现在外卖市场这么火,你们完全有条件啊!你要是搞,我继续追加对JD的投资!
东子哥:(笑着接电话)老马啊,你这主意倒是不错,我这几天正在琢磨这件事呢,不过你得答应我一个条件——我要是搞外卖,不许点我们JD的奶茶哦!
小马哥:(愣了一下,随即大笑)哈哈哈,行啊,没问题!不过你JD搞外卖,我可就不点某团的外卖了,直接喝你JD的奶茶(笑)
东子哥:(瞬间黑脸)老马,你这样开涮我不合适吧,我JD搞外卖,你要是敢点奶茶,我就让你知道什么是“JD速度”!

2 month later…
用我们的桥接模式可以很方便的扩充了JD商家,招募了骑手,很快JD外卖平台上线了…

商家&外卖骑手的UML类图如下
class JDBusiness(Business):
    """ JD商家"""
    platform = "JD"

    def delivery(self, food: str, deliveryman: DeliveryMan,  customer: str):
        print(f"{self.platform}-商家[{self.name}] 委托:")
        deliveryman.send(food, customer)


class JDDeliveryMan(DeliveryMan):
    platform = "JD"

    def send(self, food, customer):
        print(f"\t[{self.platform}]-外卖骑手-({self.name})正在配送: (客户-{customer}) 点的 {food}.")

小马哥:(坐在办公室,看着手机,坏笑)“老刘啊,你JD外卖今天第一天,之前某团的有点慢,我得亲自测一下JD的速度!
东子哥:对着新招募的骑手说,今天是我们JD外卖第一天,我要和兄弟们一起干!

# 于是小马哥在JD外卖平台偷偷的点了一杯奶茶,想尝尝JD的奶茶是什么味道..
business2 = MeituanBusiness("霸王奶茶")

# 没想到的是,今天的配送员其中就有东子哥,好巧不巧,小马哥这单子被系统随机分派给了东哥
delivery2 = MeituanDeliveryMan("东子哥")
business2.delivery("伯牙琴弦", delivery2, "小马哥")

JD-商家[霸王奶茶] 委托:
	[JD]-外卖骑手-(东子哥)正在配送: (客户-小马哥) 点的 伯牙琴弦.

15min later…
(叮咚一声,奶茶到了。小马哥开门,看到送奶茶的是东哥本人,愣了一下。)
小马哥:(假装惊讶)“哎哟,这不是老刘吗?你亲自送奶茶啊!这服务也太到位了吧!”
东子哥:(尴尬地咳嗽一声,递上奶茶)“老马,你之前可答应过我的,我刚搞外卖第一天,你就给我来了个大单子?”
小马哥:(笑嘻嘻)“嘿嘿,我这不是想支持你嘛!对了,奶茶还热乎着,你这JD速度果然名不虚传!”
东子哥:(无奈地摇摇头有点生气)“你这人啊,真是让人无语。不过话说回来,你要是以后点奶茶,我可不给你送了
小马哥:(举起奶茶,假装认真)“放心放心,我以后再也不点奶茶了!(偷偷在心里笑)”

设计模式介绍:
https://blog.csdn.net/qq_18529581/article/details/149184981?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_18529581/article/details/149448775?spm=1001.2014.3001.5501

你可能感兴趣的:(设计模式,设计模式,桥接模式)