赞
踩
桥接模式是一种设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。它允许你改变抽象部分和实现部分的实现,而无需更改它们的接口。
结构:
桥接模式涉及四个主要角色:
一个常见的桥接模式示例是图形绘制库。抽象接口可以定义绘制不同形状的方法,而实现对象可以提供不同平台(例如 Windows 或 macOS)的具体绘制实现。这允许开发人员使用相同的抽象接口在不同平台上绘制形状,而无需更改代码。
桥接模式工作原理
桥接模式核心组件及调用关系 ASCII 图
-
- +----------------+
- | Abstraction |
- +----------------+
- |
- v
- +-----------------------+------------------+
- | RefinedAbstraction1 | RefinedAbstraction2 |
- +--------------+-----------------------------+
- | |
- v v
- +--------------+ +--------------+
- | ConcreteImplementor1 | | ConcreteImplementor2 |
- +--------------+ +--------------+
-
调用关系:
客户端代码通过 RefinedAbstraction 类与 Abstraction 类进行交互。
RefinedAbstraction 类将调用委托给其关联的 ConcreteImplementor 类。
组件说明:
Abstraction:定义抽象接口,它定义了客户端代码与桥接模式交互的方式。
RefinedAbstraction:扩展 Abstraction 接口,为特定的实现提供不同的行为。
ConcreteImplementor:实现 Abstraction 接口,提供具体的实现细节。
- #include <iostream>
-
- // Abstraction: Shape
- class Shape {
- public:
- virtual void draw() = 0;
- };
-
- // Implementations: Renderer (VectorRenderer and
- // RasterRenderer)
- class Renderer {
- public:
- virtual void render() = 0;
- };
-
- class VectorRenderer : public Renderer {
- public:
- void render() override
- {
- std::cout << "Rendering as a vector\n";
- }
- };
-
- class RasterRenderer : public Renderer {
- public:
- void render() override
- {
- std::cout << "Rendering as a raster\n";
- }
- };
-
- // Concrete Abstractions: Circle and Square
- class Circle : public Shape {
- public:
- Circle(Renderer& renderer)
- : renderer(renderer)
- {
- }
-
- void draw() override
- {
- std::cout << "Drawing a circle ";
- renderer.render();
- }
-
- private:
- Renderer& renderer;
- };
-
- class Square : public Shape {
- public:
- Square(Renderer& renderer)
- : renderer(renderer)
- {
- }
-
- void draw() override
- {
- std::cout << "Drawing a square ";
- renderer.render();
- }
-
- private:
- Renderer& renderer;
- };
-
- int main()
- {
- VectorRenderer vectorRenderer;
- RasterRenderer rasterRenderer;
-
- Circle circle(vectorRenderer);
- Square square(rasterRenderer);
-
- circle.draw(); // Output: Drawing a circle Rendering as
- // a vector
- square.draw(); // Output: Drawing a square Rendering as
- // a raster
-
- return 0;
- }
桥接模式注意事项:
何时使用桥接模式:
何时不使用桥接模式:
桥接模式最佳实践:
桥接模式通过将抽象部分和实现部分分离,使得两者可以独立变化,能够做到抽象接口只定义高级概念,而具体实现提供具体的实现细节
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。