桥接模式用于将"抽象"(abstraction, 比如接口或算法)与实现方式相分离。
如果不用桥接模式,那么通常的做法是,创建若干个基类用于表示各个抽象方式, 然后从每个基类中继承出两个或多个子类,用于表示对这种抽象方式的不同实现方法。 用了桥接模式之后,我们需要创建两套独立的"类体系"(class hierarchy): "抽象体系" 定义了我们所要执行的操作(比如接口或高层算法),而“实现体系”则包含具体实现方式, 抽象体系要调用实现体系以完成其操作。抽象体系中的类会把实现体系中的某个类实例 聚合进来,而这个实例将充当抽象接口与具体实现之间的桥梁(bridge)。
class OSSClient: def __init__(self, ...): self._client = OSS(...) def url_to_path(self, url): path = ... return path def get_content(self, path): content = self._client.get_data(path, ...) return content def put_content(self, path, content): self._client.put_data(path, content)class Downloader: def __init__(self, client): self._client = client def download(url, local_path): with open(local_path, 'wb') as fp: remote_path = self._client.url_to_path(url) data = self._client.get_content(remote_path) fp.write(data)
上面的 OSSClient 即为实现体系类, Downloader 是抽象体系类:
抽象体系中的类(Downloader)会把实现体系中的某个类(OSSClient)实例 聚合进来,而这个实例将充当抽象接口与具体实现之间的桥梁(bridge)。