zoukankan      html  css  js  c++  java
  • 设计模式之桥接模式(Bridge)

    一、初识桥接模式

    对于电脑大家是在熟悉不过,看看大家的电脑,有dell的,有lenovo的。比如我的电脑室dell的,但是第一次装系统的时候用的是xp的系统,后来出 win7 了,于是我兴高采烈的装了一个win7旗舰版。关于电脑的分类的结构图大概是这样的。

    我们知道,电脑品牌多了去了,比如Acer,HP等等,系统也不只是XP和Win7,还有Linux和Unix等等啊,这样一来电脑的具体分类就多了去了。显然采用上面的结构图描述是不合理的了。我们看看还有木有其他的结构图,比如我们也可以这样的描述电脑的分类:

    先来分析一下上面的结构,将系统分为:XP系统和Win7系统,同时电脑按品牌分类可以分为Dell和Lenovo,然后电脑品牌和系统自由组合,这样就可以组合出XP系统的Dell、Win7系统的Dell、XP系统的Lenovo和Win7系统的Lenovo了。如果采用了上面的结构,现在要增加电脑品牌Acer和操作系统Linux只需要让Acer继承电脑,Linux继承系统,然后还是自由组合就行了。

    实际上第二种结构就是采用的桥接模式画出的结构图了,GoF说:桥接模式(Bridge):将抽象部分与实现部分分离,使它们都可以独立的变化。什么叫抽象部分和实现部分分离?我们分析一下上面两种结构图,可以发现一个是用继承完成的,一种是用组合/聚合的方式完成的,而采用组合/聚合的方式就是所谓的抽象与实现分离。实际上在设计类时,我们应该首先考虑的是组合/聚合的方式,而不是考虑继承的方式,因为继承是一种强耦合关系,使用继承使得子类过多的依靠父类,这并不是很好。

    二、桥接模式的代码实现

    说了这么多,还是要亲自的实现以下桥接模式。不妨就实现这个电脑分类的例子吧:

    View Code
     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 
     7 class OS
     8 {
     9 private:
    10     string name;
    11 public:
    12     OS(string n):name(n){};
    13     void set_name(string n)
    14     {
    15         this->name = n;
    16     }
    17     string get_name()
    18     {
    19         return this->name;
    20     }
    21 };
    22 //XP操作系统
    23 class XP : public OS
    24 {
    25 public:
    26     XP(string n = "XP"):OS(n){};
    27 };
    28 //Win7操作系统
    29 class Win7 : public OS
    30 {
    31 public:
    32     Win7(string n = "Win7"):OS(n){};
    33 };
    34 //Linux操作系统
    35 class Linux : public OS
    36 {
    37 public:
    38     Linux(string n = "Linux"):OS(n){};
    39 };
    40 //抽象电脑品牌
    41 class Computer
    42 {
    43 private:
    44     string brand;
    45     OS os;
    46 public:
    47     Computer(OS xt,string b):brand(b),os(xt){};
    48     void set_os(OS os)
    49     {
    50         this->os = os;
    51     }
    52     OS get_os()
    53     {
    54         return this->os;
    55     }
    56     void init()
    57     {
    58         cout<<brand<<"电脑正在运行"<<os.get_name()<<endl;
    59     }
    60 };
    61 //Dell电脑
    62 class Dell : public Computer
    63 {
    64 public:
    65     Dell(OS os,string b = "Dell"):Computer(os,b){};
    66 };
    67 //Lenovo电脑
    68 class Lenovo : public Computer
    69 {
    70 public:
    71     Lenovo(OS os,string b = "Lenovo"):Computer(os,b){};
    72 };
    73 int main()
    74 {
    75     //实例化三个操作系统
    76     XP xp;
    77     Win7 win7;
    78     Linux linux;
    79     //建立两种品牌的电脑
    80     Dell dell(xp);
    81     Lenovo lenovo(win7);
    82     dell.init();
    83     lenovo.init();
    84     //我的dell重装linux
    85     dell.set_os(linux);
    86     dell.init();
    87     return 0;
    88 }

    运行结果:

    小结:那么什么时候使用桥接模式呢?当系统可以从多个角度分类,每一种分类都有可能变化,那么就把这种多角度分类分离出来让他们独立变化,这样就可以减少他们之间的耦合。实际上使用桥接模式的好处已经不用多说了,在代码中和上面给出两种结构图中已经足够看出来了。那么想一想桥接模式和装饰模式有什么区别呢??桥接模式是适应多个维度变化的一种模式。而装饰模式是适应新需求的不断增加的一种模式。注意体会这两种模式的实现方式~~~

     


    学习中的一点总结,欢迎拍砖哦^^


     

  • 相关阅读:
    Query实例的ajax应用之二级联动的后台是采用php来做的
    关于jquery的css的一些知识
    这个代码给所有带有name属性的链接加了一个背景色
    jQuery生成一个DIV容器,ID是"rating".
    被included或者被required的文件都来自哪里呢
    msql_createdb: 建立一个新的 mSQL 数据库。
    php中调用这个功能可以在web页面中显示hello world这个经典单词
    啦啦啦测试心得
    maven命令
    robotframework使用
  • 原文地址:https://www.cnblogs.com/BeyondAnyTime/p/2665397.html
Copyright © 2011-2022 走看看