设计模式-11 - Bridge Method 桥接模式

设计模式-11 - Bridge Method 桥接模式

1.定义

桥接模式是一种设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。它允许你改变抽象部分和实现部分的实现,而无需更改它们的接口。
结构:

桥接模式涉及四个主要角色:

  • 抽象(Abstraction):定义抽象接口,客户端代码与之交互。
  • 实现(Implementor):实现抽象接口并提供具体行为。
  • 扩展抽象(Refined Abstraction):扩展抽象接口,提供更加具体的接口。
  • 具体实现(Concrete Implementor):实现扩展抽象接口并提供具体的实现。

一个常见的桥接模式示例是图形绘制库。抽象接口可以定义绘制不同形状的方法,而实现对象可以提供不同平台(例如 Windows 或 macOS)的具体绘制实现。这允许开发人员使用相同的抽象接口在不同平台上绘制形状,而无需更改代码。


2.内涵

桥接模式工作原理

  • 客户端代码通过抽象接口与桥接模式交互。
  • 抽象接口将请求委托给实现对象。
  • 实现对象执行请求并返回结果。
  • 桥接模式允许在不改变抽象接口的情况下改变实现。
  • 还可以扩展抽象接口和具体实现,以提供新的功能或行为。

桥接模式核心组件及调用关系 ASCII 图


           +----------------+
           | Abstraction    |
           +----------------+
                  |
                  v
     +-----------------------+------------------+
     | RefinedAbstraction1 | RefinedAbstraction2 |
     +--------------+-----------------------------+
                  |                  |
                  v                  v
           +--------------+           +--------------+
           | ConcreteImplementor1 |  | ConcreteImplementor2 |
           +--------------+           +--------------+
           


调用关系:

客户端代码通过 RefinedAbstraction 类与 Abstraction 类进行交互。
RefinedAbstraction 类将调用委托给其关联的 ConcreteImplementor 类。
组件说明:

Abstraction:定义抽象接口,它定义了客户端代码与桥接模式交互的方式。
RefinedAbstraction:扩展 Abstraction 接口,为特定的实现提供不同的行为。
ConcreteImplementor:实现 Abstraction 接口,提供具体的实现细节。

           
3.使用示例
#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;
}

4.注意事项

桥接模式注意事项:

  • 复杂性:桥接模式引入了额外的抽象层,这可能会增加代码的复杂性。
  • 性能开销:在桥接模式中,抽象类和具体实现类之间的调用可能引入性能开销。
  • 过度设计:在某些情况下,桥接模式可能被过度使用,导致不必要的复杂性。
  • 多重继承的替代方案:在某些语言中,多重继承可以提供与桥接模式类似的功能,但可能更简单且性能更高。
  • 接口的稳定性:桥接模式依赖于稳定的抽象接口。如果接口经常更改,则可能会导致应用程序不稳定。


何时使用桥接模式:

  • 当你需要在不改变抽象部分的情况下改变实现部分时。
  • 当你想要将不同类型的实现封装在统一的接口后面时。
  • 当你想在多个平台或环境中使用相同的抽象接口时。


何时不使用桥接模式:

  • 当抽象部分和实现部分之间没有明确的分离时。
  • 当性能开销不可接受时。
  • 当代码的复杂性已经很高时。

5.最佳实践

桥接模式最佳实践:

  • 明确分离抽象和实现:确保抽象接口只定义高级概念,而具体实现提供具体的实现细节。
  • 保持抽象接口稳定:避免经常更改抽象接口,因为这可能会破坏依赖于该接口的代码。
  • 使用组合而非继承:桥接模式通常使用组合而不是继承来实现分离,这提供了更大的灵活性。
  • 避免过度使用:只有在确实需要在不更改抽象的情况下更改实现时才使用桥接模式。
  • 考虑性能开销:在桥接模式中,抽象类和具体实现类之间的调用可能会引入性能开销,因此在性能关键的应用程序中要谨慎使用。
  • 使用清晰的命名约定:为抽象接口、扩展抽象和具体实现类使用明确的命名约定,以提高代码的可读性和可维护性。
6.总结


桥接模式通过将抽象部分和实现部分分离,使得两者可以独立变化,能够做到抽象接口只定义高级概念,而具体实现提供具体的实现细节

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一组经过实践验证的面向对象设计原则和模式,可以帮助开发人员解决常见的软件设计问题。下面是常见的23种设计模式: 1. 创建型模式(Creational Patterns): - 工厂方法模式(Factory Method Pattern) - 抽象工厂模式(Abstract Factory Pattern) - 单例模式(Singleton Pattern) - 原型模式(Prototype Pattern) - 建造者模式(Builder Pattern) 2. 结构型模式(Structural Patterns): - 适配器模式(Adapter Pattern) - 桥接模式Bridge Pattern) - 组合模式(Composite Pattern) - 装饰器模式(Decorator Pattern) - 外观模式(Facade Pattern) - 享元模式(Flyweight Pattern) - 代理模式(Proxy Pattern) 3. 行为型模式(Behavioral Patterns): - 责任链模式(Chain of Responsibility Pattern) - 命令模式(Command Pattern) - 解释器模式(Interpreter Pattern) - 迭代器模式(Iterator Pattern) - 中介者模式(Mediator Pattern) - 备忘录模式(Memento Pattern) - 观察者模式(Observer Pattern) - 状态模式(State Pattern) - 策略模式(Strategy Pattern) - 模板方法模式(Template Method Pattern) - 访问者模式(Visitor Pattern) 4. 并发型模式(Concurrency Patterns): - 保护性暂停模式(Guarded Suspension Pattern) - 生产者-消费者模式(Producer-Consumer Pattern) - 读写锁模式(Read-Write Lock Pattern) - 信号量模式(Semaphore Pattern) - 线程池模式(Thread Pool Pattern) 这些设计模式可以根据问题的特点和需求来选择使用,它们提供了一些可复用的解决方案,有助于开发高质量、可维护且易于扩展的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值