zoukankan      html  css  js  c++  java
  • 【结构型】Bridge模式

        桥接模式是为了将对象的抽象与实现分离,使得它们可以独立变化。简简单单的一句话,却已经是站在了更高抽象层面上来看待、设计、解决问题。平常我们多是对具体问题进行分析、抽象,然后就开始设计,这对多数情况下基本完全够用,毕竟实际项目中的功能模块都是找一“最优解的"实现来解决掉问题,把功能设计出来即可。这种情况下的结构关系图参考如下:

        这种抽象设计的缺点是:如果解决问题的方式不止一种,则必需为以上所有Concrete类都是实现对应的具体版本,这样不但类继承体系十分复杂,后期只要随便增加一种实现方式,都将要增加N个对应的新class。为解决这类问题,需要将问题的具体实现剥离出来单独抽象,并在问题抽象层面与实现抽象层面做个关联桥接即可。从而在问题抽象层面上,就不需要关心当前问题是如何被解决的(即:如何实现的)。改进后的类关系图(即:Bridge模式的类关系图参考如下):

        从关系图中可看出,不论是日后增加新Target,还是扩展新实现方式,对于逻辑结构都不需要做调整,也不会因为扩展了新的实现而引起整个Target系列的动荡。模式的编码结构参考如下:

     1 namespace bridge
     2 {
     3     class IImpl;
     4     class ITarget
     5     {
     6     public:
     7         virtual void doSomething() = 0;
     8         // some code here........
     9 
    10     protected:
    11         IImpl* getImpl() { return _impl; }
    12 
    13     private:
    14         IImpl* _impl;
    15 
    16     };//class ITarget
    17 
    18     class ConcreteTarget : public ITarget
    19     {
    20     public:
    21         virtual void doSomething() override {
    22             auto pImpl = this->getImpl();
    23             if (nullptr != pImpl) {
    24                 pImpl->realDoSomething();
    25             }
    26             // some other code here........
    27         }
    28 
    29     };//class ConcreteTarget
    30 
    31     class IImpl
    32     {
    33     public:
    34         virtual void realDoSomething() = 0;
    35 
    36     };//class IImpl
    37 
    38     class ConcreteImpl1 : public IImpl
    39     {
    40     public:
    41         virtual void realDoSomething() override { /* some code here........ */ }
    42 
    43     };//class ConcreteImpl1
    44 
    45     class ConcreteImpl2 : public IImpl
    46     {
    47     public:
    48         virtual void realDoSomething() override { /* some code here........ */ }
    49 
    50     };//class ConcreteImpl2
    51 
    52 }//namespace bridge
    Bridge模式编码结构参考
  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/tongy0/p/5526116.html
Copyright © 2011-2022 走看看