原理是基于面向对象的多态特性 基于类的最小设计原则 使用封装、聚合和继承等行为将抽象部分和实现部分解耦(这里的实现部分并不是具体的实现类,而是一个具体实现类的接口,抽象类的操作都会委托给具体实现类执行) 使得它们可以独立变化互不影响 它们之间通过一个桥梁接口联系
比如我们平时点外卖,平台给派单,骑实不用关心他送的是什么外卖,他只需要负责把外卖按时送到顾客手里就算完成了任务。 在这个例子中,有几个角色: 商家、外卖骑手、顾客。对于商家来说,并不关心哪个骑手配送他家的外卖,商家只需要打包好外卖,等骑手过来领取; 商家和顾客之间是通过外卖小哥间接接触的,那我们可以将这个逻辑关系抽象出来。 我们我们暂时只关注商家和骑手,不用关注顾客订餐的细节。
于是我们杜撰出一个超级大杂烩平台,且虚构出一个胡扯的故事…
# 实现类接口
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外卖平台上线了…
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