桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。
层次结构中的第一层 (通常称为抽象部分) 将包含对第二层 (实现部分) 对象的引用。 抽象部分将能将一些 (有时是绝大部分) 对自己的调用委派给实现部分的对象。 所有的实现部分都有一个通用接口, 因此它们能在抽象部分内部相互替换。
进一步了解桥接模式
使用示例:桥接模式在处理跨平台应用、 支持多种类型的数据库服务器或与多个特定种类 (例如云平台和社交网络等) 的 API 供应商协作时会特别有用。
识别方法:桥接可以通过一些控制实体及其所依赖的多个不同平台之间的明确区别来进行识别。
概念示例
本例说明了桥接设计模式的结构并重点回答了下面的问题:
- 它由哪些类组成?
- 这些类扮演了哪些角色?
- 模式中的各个元素会以何种方式相互关联?
main.py: 概念示例
from __future__ import annotationsfrom abc import ABC, abstractmethodclass Abstraction: """ The Abstraction defines the interface for the "control" part of the two class hierarchies. It maintains a reference to an object of the Implementation hierarchy and delegates all of the real work to this object. """ def __init__(self, implementation: Implementation) -> None: self.implementation = implementation def operation(self) -> str: return (f"Abstraction: Base operation with:\n" f"{self.implementation.operation_implementation()}")class ExtendedAbstraction(Abstraction): """ You can extend the Abstraction without changing the Implementation classes. """ def operation(self) -> str: return (f"ExtendedAbstraction: Extended operation with:\n" f"{self.implementation.operation_implementation()}")class Implementation(ABC): """ The Implementation defines the interface for all implementation classes. It doesn't have to match the Abstraction's interface. In fact, the two interfaces can be entirely different. Typically the Implementation interface provides only primitive operations, while the Abstraction defines higher- level operations based on those primitives. """ @abstractmethod def operation_implementation(self) -> str: pass"""Each Concrete Implementation corresponds to a specific platform and implementsthe Implementation interface using that platform's API."""class ConcreteImplementationA(Implementation): def operation_implementation(self) -> str: return "ConcreteImplementationA: Here's the result on the platform A."class ConcreteImplementationB(Implementation): def operation_implementation(self) -> str: return "ConcreteImplementationB: Here's the result on the platform B."def client_code(abstraction: Abstraction) -> None: """ Except for the initialization phase, where an Abstraction object gets linked with a specific Implementation object, the client code should only depend on the Abstraction class. This way the client code can support any abstraction- implementation combination. """ # ... print(abstraction.operation(), end="") # ...if __name__ == "__main__": """ The client code should be able to work with any pre-configured abstraction- implementation combination. """ implementation = ConcreteImplementationA() abstraction = Abstraction(implementation) client_code(abstraction) print("\n") implementation = ConcreteImplementationB() abstraction = ExtendedAbstraction(implementation) client_code(abstraction)
Output.txt: 执行结果
Abstraction: Base operation with: ConcreteImplementationA: Here's the result on the platform A. ExtendedAbstraction: Extended operation with: ConcreteImplementationB: Here's the result on the platform B.