文本是《设计模式(共12篇)》专题的第 11 篇。阅读本文前,建议先阅读前面的文章:
桥接模式详解
1️⃣ 概念
定义: 将抽象部分与它的具体实现部分分离,使他们都可以独立的变化;通过组合的方式建立两个类之间联系,而不是继承。
类型: 结构型
2️⃣ 适用场景
- 抽象与具体实现之间增加更多的灵活性
 - 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要进行独立扩展
 - 不希望使用继承,或因为多层继承导致系统类的个数剧增
 
3️⃣ 优点
- 分离抽象部分及其具体实现部分
 - 提高了系统的可扩展性
 - 符合开闭原则
 - 符合合成复用原则
 
4️⃣ 缺点
- 增加了系统的理解与设计难度
 - 需要正确地识别出系统中两个独立变化的维度
 
5️⃣ 桥接模式 Coding
① 创建Account抽象基类
from abc import ABC, abstractmethod
class Account(ABC):
    @abstractmethod
    def open_account(self):
        pass
    @abstractmethod
    def show_account_type(self):
        pass
② 创建DepositAccount类继承Account类
class DepositAccount(Account):
    def open_account(self):
        print("打开定期账号")
        return DepositAccount()
    def show_account_type(self):
        print("这是一个定期账号")
③ 创建SavingAccount类继承Account类
class SavingAccount(Account):
    def open_account(self):
        print("打开活期账号")
        # ...
        return SavingAccount()
    def show_account_type(self):
        print("这是一个活期账号")
④ 创建抽象类Bank
from abc import ABC, abstractmethod
class Bank(ABC):
    def __init__(self, account: Account):
        self.account = account
    @abstractmethod
    def open_account(self):
        pass
⑤ 创建ABCBank类继承Bank类
class ABCBank(Bank):
    def __init__(self, account: Account):
        super().__init__(account)
    def open_account(self):
        print("打开中国农业银行账号")
        self.account.open_account()
        return self.account
⑥ 创建ICBCBank类继承Bank类
class ICBCBank(Bank):
    def __init__(self, account: Account):
        super().__init__(account)
    def open_account(self):
        print("打开中国工商银行账号")
        self.account.open_account()
        return self.account
⑦ UML类图
⑧ 创建测试文件
def test_bridge_pattern():
    # 工商银行开定期账户
    icbc_bank = ICBCBank(DepositAccount())
    icbc_account = icbc_bank.open_account()
    icbc_account.show_account_type()
    # 工商银行开活期账户
    icbc_bank2 = ICBCBank(SavingAccount())
    icbc_account2 = icbc_bank2.open_account()
    icbc_account2.show_account_type()
    # 农业银行开活期账户
    abc_bank = ABCBank(SavingAccount())
    abc_account = abc_bank.open_account()
    abc_account.show_account_type()
if __name__ == "__main__":
    test_bridge_pattern()
6️⃣ 桥接模式的实际应用
Python标准库 database API specification (PEP 249)
在Python中,数据库连接模块如sqlite3、psycopg2等都遵循PEP 249规范,这是桥接模式的一个很好的实际应用例子。
您已阅读完《设计模式(共12篇)》专题的第 11 篇。请继续阅读该专题下面的文章:
