zoukankan      html  css  js  c++  java
  • 桥接模式

    1.概述

      将抽象部分与实现部分脱耦,使它们都可以独立的变化。 ——《设计模式》GOF 

      所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。

      桥接模式所解决的问题是将两个维度的变化分离开,使它们可以独立的变化,是采用组合的方式使两个维度联系起来。

    2.优缺点

      优点
      1)将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。

      2)将可以共享的变化部分,抽离出来,减少了代码的重复信息。

      3)对象的具体实现可以更加灵活,可以满足多个因素变化的要求。

      缺点
      1)客户必须知道选择哪一种类型的实现。

    3.与继承的比较

      待补充。

    4.策略模式、建造者模式、桥接模式的比较

      如果不考虑使用场景,单从实现过程来看,桥接模式是策略模式的横向扩展,即维度扩展,如软件维度增加一个手机维度;建造者模式是策略模式的纵向扩展,即增加了一个层次,如软件维度分解成不同的流程,由一个类统一调度。

      PS:求喷~

    5.策略模式与建造者模式比较代码

      待补充。

    6.桥接模式与策略模式的比较代码

      《大话设计模式C++版》中以手机和软件为例描述了桥接模式。我们先用策略模式来实现一种手机上安装不同软件。

     

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 
     6 //手机软件
     7 class HandsetSoft
     8 {
     9 public:
    10     virtual void Run()=0;
    11 };
    12 
    13 //游戏软件
    14 class HandsetGame : public HandsetSoft
    15 {
    16 public:
    17     virtual void Run()
    18     {
    19         cout<<"运行手机游戏"<<endl;
    20     }
    21 };
    22 
    23 //通讯录软件
    24 class HandSetAddressList : public HandsetSoft
    25 {
    26 public:
    27     virtual void Run()
    28     {
    29         cout<<"手机通讯录"<<endl;
    30     }
    31 };
    32 
    33 //手机
    34 class Handset
    35 {
    36 protected:
    37     HandsetSoft* m_soft;
    38 public:
    39     void SetHandsetSoft(HandsetSoft* temp)
    40     {
    41         m_soft = temp;
    42     }
    43     virtual void Run()
    44     {
    45         m_soft->Run();
    46     }
    47 };
    48 
    49 
    50 //客户端
    51 int main()
    52 {
    53     Handset *brand = new HandSet();
    54     brand->SetHandsetSoft(new HandsetGame());
    55     brand->run();
    56 
    57     return 0;
    58 }

     

      再将手机加上品牌这一维度:

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 
     6 //手机软件
     7 class HandsetSoft
     8 {
     9 public:
    10     virtual void Run()=0;
    11 };
    12 
    13 //游戏软件
    14 class HandsetGame : public HandsetSoft
    15 {
    16 public:
    17     virtual void Run()
    18     {
    19         cout<<"运行手机游戏"<<endl;
    20     }
    21 };
    22 
    23 //通讯录软件
    24 class HandSetAddressList : public HandsetSoft
    25 {
    26 public:
    27     virtual void Run()
    28     {
    29         cout<<"手机通讯录"<<endl;
    30     }
    31 };
    32 
    33 //手机品牌
    34 class HandsetBrand
    35 {
    36 protected:
    37     HandsetSoft* m_soft;
    38 public:
    39     void SetHandsetSoft(HandsetSoft* temp)
    40     {
    41         m_soft = temp;
    42     }
    43     // 策略模式中,软件只需运行于一个平台
    44     // 桥接模式中,对软件运行平台这一维度进行扩展,
    45     // 使软件运行与不同平台
    46     // 使软件和平台这两个维度能独立变化
    47     virtual void Run()=0;
    48 };
    49 
    50 //M品牌
    51 class HandsetBrandM : public HandsetBrand
    52 {
    53 public:
    54     virtual void Run()
    55     {
    56         m_soft->Run();
    57     }
    58 };
    59 
    60 //N品牌
    61 class HandsetBrandN : public HandsetBrand
    62 {
    63 public:
    64     virtual void Run()
    65     {
    66         m_soft->Run();
    67     }
    68 };
    69 
    70 //客户端
    71 int main()
    72 {
    73     HandsetBrand *brand = new HandsetBrandM();
    74     brand->SetHandsetSoft(new HandsetGame());
    75     brand->Run();
    76     brand->SetHandsetSoft(new HandSetAddressList());
    77     brand->Run();
    78 
    79     return 0;
    80 }

     

  • 相关阅读:
    找水王
    第十四周学习记录
    第十三周学习记录
    第十二周学习记录
    序列化
    哪个元素出发事件
    阻止默认行为-event.preventDefault();
    阻止时间冒泡 -event.stopPropagation();
    HTML5的LocalStorage和sessionStorage的使用 -缓存
    同步加载、异步加载、延迟加载
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4263765.html
Copyright © 2011-2022 走看看