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模式编码结构参考
  • 相关阅读:
    React Native区分安卓/iOS平台
    yarn命令使用
    React 源码剖析系列 - 不可思议的 react diff
    dangerouslySetInnerHTMl
    iOS12下APP进入后台后再返回前台连接断开
    AttributedString-富文本字符串
    Bundle创建与使用
    UIButton-详解
    实战项目-百思不得姐-精华
    iOS 抖音个人主页布局开发(简单)
  • 原文地址:https://www.cnblogs.com/tongy0/p/5526116.html
Copyright © 2011-2022 走看看