`
lorry1113
  • 浏览: 255648 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

bridge 桥接模式_ 简单

    博客分类:
  • java
阅读更多
学习设计模式也有一段时间了,今天就把我整理的一篇课程和大家分享,有不妥之处欢迎指出.
生活中的一个例子:
    就拿汽车在路上行驶的来说。即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,然而它们所行驶的环境(路)也在变化,在软件系统中就要适应两个方面的变化?怎样实现才能应对这种变化呢?
概述:
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
意图:
   将抽象部分与实现部分分离,使它们都可以独立的变化。
                                                                    ——《设计模式》GOF

代码实现:
1namespace CarRunOnRoad
2{
3    //路的基类;
4    public  class Road
5    {
6        public virtual void Run()
7        {
8            Console.WriteLine("在路上");
9        }
10    }
11    //高速公路;
12    public class SpeedWay : Road
13    {
14        public override void Run()
15        {
16            Console.WriteLine("高速公路");
17        }
18    }
19    //市区街道;
20    public class Street : Road
21    {
22        public override void Run()
23        {
24            Console.WriteLine("市区街道");
25        }
26    }
27    //小汽车在高速公路上行驶;
28    public class CarOnSpeedWay : SpeedWay
29    {
30        public override void Run()
31        {
32            Console.WriteLine("小汽车在高速公路上行驶");
33        }
34    }
35    //公共汽车在高速公路上行驶;
36    public class BusOnSpeedWay : SpeedWay
37    {
38        public override void Run()
39        {
40            Console.WriteLine("公共汽车在高速公路上行驶");
41        }
42    }
43    //小汽车在市区街道上行驶;
44    public class CarOnStreet : Street
45    {
46        public override void Run()
47        {
48            Console.WriteLine("汽车在街道上行驶");
49        }
50    }
51    //公共汽车在市区街道上行驶;
52    public class BusOnStreet : Street
53    {
54        public override void Run()
55        {
56            Console.WriteLine("公共汽车在街道上行驶");
57        }
58    }
59  
60}

客户端调用:
1static void Main(string[] args)
2        {
3            //小汽车在高速公路上行驶
4            CarOnSpeedWay Car = new CarOnSpeedWay();
5            Car.Run();
6
7            Console.WriteLine("===========================");
8
9            //公共汽车在街道上行驶
10            BusOnStreet Bus = new BusOnStreet();
11            Bus.Run();
12
13            Console.Read();
14        }

缺点:
     但是我们说这样的设计是脆弱的,仔细分析就可以发现,它还是存在很多问题,首先它在遵循开放-封闭原则的同时,违背了类的单一职责原则,即一个类只有一个引起它变化的原因,而这里引起变化的原因却有两个,即路类型的变化和汽车类型的变化;其次是重复代码会很多,不同的汽车在不同的路上行驶也会有一部分的代码是相同的;再次是类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。如果变化沿着汽车的类型和不同的道路两个方向变化,我们会看到这个类的结构会迅速的变庞大。


应用设计模式
       桥接模式(Bridge)来做;
                         
代码实现:
1namespace CarRunOnRoad_Bridge_
2{
3
4    //抽象路
5    public abstract class AbstractRoad
6    {
7        protected AbstractCar car;
8        public AbstractCar Car
9        {
10            set
11            {
12                car = value;
13            }
14        }
15
16        public abstract void Run();
17    }
18
19    //高速公路
20    public class SpeedWay : AbstractRoad
21    {
22        public override void Run()
23        {
24            car.Run();
25            Console.WriteLine("高速公路上行驶");
26        }
27    }
28
29    //市区街道
30    public class Street : AbstractRoad
31    {
32        public override void Run()
33        {
34            car.Run();
35            Console.WriteLine("市区街道上行驶");
36        }
37    }
38}

1namespace CarRunOnRoad_Bridge_
2{
3    //抽象汽车
4    public abstract class AbstractCar
5    {
6        public abstract void Run();
7    }
8
9    //小汽车;
10    public class Car : AbstractCar
11    {
12        public override void Run()
13        {
14            Console.Write("小汽车在");
15        }
16    }
17
18    //公共汽车
19    public class Bus : AbstractCar
20    {
21        public override void Run()
22        {
23            Console.Write("公共汽车在");
24        }
25    }
26}

客户端调用:
1 static void Main(string[] args)
2        {
3            //小汽车在高速公路上行驶;
4            AbstractRoad Road1 = new SpeedWay();
5            Road1.Car = new Car();
6            Road1.Run();
7            Console.WriteLine("=========================");
8
9            //公共汽车在高速公路上行驶;
10            AbstractRoad Road2 = new SpeedWay();
11            Road2.Car = new Bus();
12            Road2.Run();
13
14          
15
16            Console.Read();
17        }

      可以看到,通过对象组合的方式,Bridge 模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是Bridge模式的本意。
      这样增加了客户程序与路与汽车的耦合。其实这样的担心是没有必要的,因为这种耦合性是由于对象的创建所带来的,完全可以用创建型模式去解决。在应用时结合创建型设计模式来处理具体的问题。
应用设计模式:
       桥接模式(Bridge)来做(多维度变化);
       结合上面的例子,增加一个维度"人",不同的人开着不同的汽车在不同的路上行驶(三个维度);
       结合上面增加一个类"人",并重新调用.
代码实现:
1namespace CarRunOnRoad_Bridge_
2{
3    abstract class people
4    {
5        AbstractRoad road;
6        public AbstractRoad Road
7        {
8            get
9            {
10                return road;
11            }
12            set
13            {
14                road = value;
15            }
16        }
17        public abstract void Run();
18
19    }
20    class Man : people
21    {
22        public override void Run()
23        {
24            Console.Write("男人开着");
25            Road.Run();
26        }
27    }
28
29    class WoMan : people
30    {
31        public override void Run()
32        {
33            Console.Write("女人开着");
34            Road.Run();
35        }
36    }
37}

客户端调用:
1 static void Main(string[] args)
2        {
3           
4            //男人开着公共汽车在高速公路上行驶;
5            Console.WriteLine("=========================");
6
7            AbstractRoad Road3 = new SpeedWay();
8            Road3.Car = new Bus();
9
10            people p = new Man();
11            p.Road = Road3;
12            p.Run();
13
14            Console.Read();
15        }

效果及实现要点:
1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同汽车。
3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

适用性:
   在以下的情况下应当使用桥梁模式:
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
总结:
      Bridge模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。

桥接模式与装饰的区别:
装饰模式:
      这两个模式在一定程度上都是为了减少子类的数目,避免出现复杂的继承关系。但是它们解决的方法却各有不同,装饰模式把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要,当我们把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合 .
桥接模式:
          桥接模式则把原来的基类的实现化细节抽象出来,在构造到一个实现化的结构中,然后再把原来的基类改造成一个抽象化的等级结构,这样就可以实现系统在多个维度上的独立变化 。
分享到:
评论

相关推荐

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    .NET设计模式(9):桥接模式(BridgePattern)

    [GOF《设计模式》]图1Bridge模式结构图桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的双...

    23种java版设计模式源码案例.zip

    桥接模式(bridge) 组合模式(composite) 装饰器模式(decorate) 外观模式(facecade) 享元模式(flyweight) 代理模式(proxy) 行为型模式(behaviour) 责任链模式(chainrespon) 命令模式(commond) 解释器模式(interpreter...

    设计模式,软件开发者必读

    3.2 BRIDGE 桥接模式 33 3.3 COMPOSITE 组合模式 38 3.4 DECORATOR 装饰模式 43 3.5 FACADE 外观模式 46 3.6 FLYWEIGHT 享元模式 49 3.7 PROXY 代理模式 53 行为模式 57 4.1 CHAIN OF RESPONSIBILITY 职责链模式 57 ...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) ...16. 桥接模式 (Bridge Pattern) 17. 观察者模式 (Observer Pattern)

    研磨设计模式(完整带书签).part2.pdf

    本电子书一共两个压缩文档,本文件为part2. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    设计模式探索系列之Bridge模式

    [GOF《设计模式》] 结构图图1Bridge模式结构图 生活中的例子 桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,都是桥接的例子。开关的目的是将设备打开或关闭。...

    Delphi模式编程第一分卷

    第10章 桥接模式(Bridge) 10.1 模式解说 10.2 结构和用法 10.2.1 模式结构 10.2.2 代码模板 10.3 范例与实践 10.3.1 使用桥接模式改进数据持久层的健壮性 10.3.2 基于桥接模式的一个数据视图程序 10.3.3 ...

    Delphi模式编程第二分卷

    第10章 桥接模式(Bridge) 10.1 模式解说 10.2 结构和用法 10.2.1 模式结构 10.2.2 代码模板 10.3 范例与实践 10.3.1 使用桥接模式改进数据持久层的健壮性 10.3.2 基于桥接模式的一个数据视图程序 ...

    23个软件设计类图详解.rar

    2、Bridge 桥接 3、Composite 组合模式 4、Decorator装饰者 5、Façade 外观、门面 6、Flyweight 享元模式 7、Proxy 代理模式 11个行为模式: 1、Chain of Responsibility 职责链 2、Command 命令 3、...

    研磨设计模式(完整带书签).part1.pdf

    本电子书一共两个压缩文档,该文档为part1。 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part2

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part4

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式-part3

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part3(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part2(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part4(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    研磨设计模式.part1(共4个)

    完整清晰版,完美书签. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。...第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献

    design-pattern-java.pdf

    桥接模式-Bridge Pattern 处理多维度变化——桥接模式(一) 处理多维度变化——桥接模式(二) 处理多维度变化——桥接模式(三) 处理多维度变化——桥接模式(四) 组合模式-Composite Pattern 树形结构的处理...

Global site tag (gtag.js) - Google Analytics