ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

桥接模式

2021-05-24 15:36:41  阅读:358  来源: 互联网

标签:std Abstraction 桥接 Implementation 模式 implementation public


桥接模式

桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。

场景

这样一个问题:

  1. 客户给了你一个需求,于是使用一个类来实现(A);
  2. 客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1和A2);
  3. 客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00和A01,其中A00表示原来的类A)实现不同操作系统上的客户需求,这样我们就有了一共4个类。
  4. 可能用户的需求又有变化,比如说又有了一种新的算法…
  5. 我们陷入了一个需求变化的郁闷当中,也因此带来了类的迅速膨胀。

结构图

alt text

在Bridge模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相** 独立地进行修改**:例如上面问题中的客户需求变化,当用户需求需要从Abstraction派生一个具体子类时候,并不需要像上面通过继承方式实现时候需要添加子类A1和A2了。另外当上面问题中由于算法添加也只用改变右边实现(添加一个具体化子类),而左边不用在变化,也不用添加具体子类了。

层次结构中的第一层 (通常称为抽象部分) 将包含对第二层 (实现部分) 对象的引用。 抽象部分将能将一些 (有时是绝大部分) 对自己的调用委派给实现部分的对象。 所有的实现部分都有一个通用接口, 因此它们能在抽象部分内部相互替换。

实例

class Implementation
{
  public:
    virtual ~Implementation() {}
    virtual std::string operationImplementation() const=0;
}

class ConcreteImplementationA : public Implementation
{
 public:
  std::string OperationImplementation() const override {
    return "ConcreteImplementationA: Here's the result on the platform A.\n";
  }
};

class ConcreteImplementationB : public Implementation
{
 public:
  std::string OperationImplementation() const override {
    return "ConcreteImplementationB: Here's the result on the platform B.\n";
  }
};

class Abstraction
{
 protected:
  Implementation* implementation_;
 public:
  Abstraction(Implementation* implementation) : implementation_(implementation) {
  }

  virtual ~Abstraction() {}

  virtual std::string Operation() const
  {
    return "Abstraction: Base operation with:\n" +
           this->implementation_->OperationImplementation();
  }
};
class ExtendedAbstraction : public Abstraction
{
 public:
  ExtendedAbstraction(Implementation* implementation) : Abstraction(implementation) {}
  std::string Operation() const override
  {
    return "ExtendedAbstraction: Extended operation with:\n" +
           this->implementation_->OperationImplementation();
  }
};

int main() {
  Implementation* implementation = new ConcreteImplementationA;
  Abstraction* abstraction = new Abstraction(implementation);
  abstraction->Operation();
  std::cout << std::endl;
  delete implementation;
  delete abstraction;

  implementation = new ConcreteImplementationB;
  abstraction = new ExtendedAbstraction(implementation);
  abstraction->Operation();

  delete implementation;
  delete abstraction;

  return 0;
}

与其他类关系

  • **桥接模式通常会于开发前期进行设计, 使你能够将程序的各个部分独立开来以便开发。 另一方面, 适配器模式 通常在已有程序中使用, 让相互不兼容的类能很好地合作。
  • 桥接、 状态模式和策略模式 (在某种程度上包括适配器) 模式的接口非常相似。 实际上, 它们都基于组合模式——即将工作委派给其他对象, 不过也各自解决了不同的问题。 模式并不只是以特定方式组织代码的配方, 你还可以使用它们来和其他开发者讨论模式所解决的问题。

标签:std,Abstraction,桥接,Implementation,模式,implementation,public
来源: https://www.cnblogs.com/ultramanX/p/14804580.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有