万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • 数据结构与算法

  • 设计模式

    • 23种设计模式

      • 设计模式概述
      • 监听模式
      • 状态模式
      • 中介模式
      • 装饰模式
      • 单例模式
      • 原型模式
      • 职责模式
      • 代理模式
      • 外观/门面模式
      • 迭代模式
      • 组合模式
      • 构建模式
      • 适配器模式
      • 策略模式
      • 工厂模式
      • 命令模式
      • 备忘模式
      • 享元模式
      • 访问模式
      • 模板模式
      • 桥接模式
        • 什么是桥接模式
        • 桥接模式的设计思想
        • 桥接模式的框架模型
        • 实战应用
        • 应用场景
      • 解释模式
    • 设计模式拓展

    • 设计原则

  • 编程方法论

  • 分布式设计与微服务理论

  • Leetcode

  • 程序员内功
  • 设计模式
  • 23种设计模式
2021-07-01
目录

桥接模式

# 桥接模式

# 什么是桥接模式

Decouple an abstraction from its implementation so that the two can vary independently.

桥接模式就是将抽象和实现解耦,使得它们可以独立地变化。

# 桥接模式的设计思想

桥接模式可以和策略模式合为一个模式,因为它们的思想相同,代码结构也几乎一样。只是策略模式侧重于对象行为,关注对算法、规则的封装,使得算法可以独立于使用它的用户而变化,属于行为型模式;而桥接模式侧重于软件结构,关注抽象和实现的分离,使得它们可以独立地发展,属于结构型模式。

# 桥接模式的框架模型

# 类图

桥接模式框架类

从类图可以看出,桥接模式和策略模式几乎是一样的,只是多了对抽象(Abstraction)的具体实现类,用于对抽象化角色进行修正。类图中的类说明:

Implementor:一个接口类,定义必要的行为和属性;ImplementorImplA和ImplementorImplB是具体的接口实现类。

Abstraction:抽象化类,它的作用是对接口类Implementor进行一些行为的抽象;

RefinedAbstraction:是抽象化类Abstraction的具体实现类,对抽象化类进行修改。

# 实战应用

在几何图形的分类中,假设我们有矩形和椭圆之分,这时我们又希望加入颜色(红色、绿色)来拓展它的层级。如果用一般继承的思想,则会有如下类图:

桥接实战

如果我们再增加几个形状(如三角形),再增加几种颜色(如蓝色、紫色),这个类图将会越来越臃肿。这时,我们就希望对这个设计进行解耦,将形状和颜色分成两个分支,独立发展,互不影响。桥接模式就派上用场了,我们看一下使用桥接模式后的类图,如下图所示:

桥接实战2

使用代码实现如下:

# 桥接模式 - 几何图形
from abc import ABCMeta, abstractmethod
# 引入ABCMeta和abstractmethod来定义抽象类和抽象方法


class Shape(metaclass=ABCMeta):
    """形状"""

    def __init__(self, color):
        self._color = color

    @abstractmethod
    def getShapeType(self):
        pass

    def getShapeInfo(self):
        return self._color.getColor() + "的" + self.getShapeType()


class Rectangle(Shape):
    """矩形"""

    def __init__(self, color):
        super().__init__(color)

    def getShapeType(self):
        return "矩形"


class Ellipse(Shape):
    """椭圆"""

    def __init__(self, color):
        super().__init__(color)

    def getShapeType(self):
        return "椭圆"


class Color(metaclass=ABCMeta):
    """颜色"""

    @abstractmethod
    def getColor(self):
        pass


class Red(Color):
    """红色"""

    def getColor(self):
        return "红色"


class Green(Color):
    """绿色"""

    def getColor(self):
        return "绿色"


def testShape():
    redRect = Rectangle(Red())
    print(redRect.getShapeInfo())
    greenRect = Rectangle(Green())
    print(greenRect.getShapeInfo())

    redEllipse = Ellipse(Red())
    print(redEllipse.getShapeInfo())
    greenEllipse = Ellipse(Green())
    print(greenEllipse.getShapeInfo())


if __name__ == '__main__':
    testShape()

"""
红色的矩形
绿色的矩形
红色的椭圆
绿色的椭圆
"""

# 应用场景

  1. 一个产品(或对象)有多种分类和多种组合,即两个(或多个)独立变化的的维度,每个维度都希望独立进行扩展。
  2. 因为使用继承或因为多层继承导致系统类的个数急剧增加的系统,可以改用桥接模式来实现。

摘自: 罗伟富. 《人人都懂设计模式:从生活中领悟设计模式:Python实现》. 电子工业出版社

#23种设计模式
上次更新: 5/21/2023, 11:34:33 PM
解释模式

解释模式→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式