`

桥接模式 bridge

阅读更多

桥接模式: 将抽象和行为划分开来,各自独立,但能动态的结合。
    在这里抽象不是表示抽象类或接口,而是表示对应于现实的一种实体的集合。比如说人就是一种抽象,吃饭就是一种行为。抽象不一定有行为。但行为一定是依附于抽象的。对于抽象的不同子集会有不同的行为。而同样的行为也可能属于抽象的不同子集。这样我们可以把行为抽取出来进行不重不漏的分类封装。从而和抽象的子集进行"排列组合"。
类图:


下面来谈一谈防盗门。如果我们把门设计成和门的防盗功能结合在一起。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 public abstract class Door
 2    {
 3        public  void Open()
 4        {
 5            System.Diagnostics.Debug.WriteLine("base open;");
 6        }

 7        public  void Close()
 8        {
 9            System.Diagnostics.Debug.WriteLine("base close;");
10        }

11        public virtual void AgainstTheft()
12        {
13            System.Diagnostics.Debug.WriteLine("base AgainstTheft;");
14        }

15    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 class WoodAgStrikeDoor:Door
2    {
3        public override void AgainstTheft()
4        {
5            System.Diagnostics.Debug.WriteLine("AgStrike AgainstStrike;");
6            //这个用来方砸的
7        }

8    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1public class WoodAgPrizeDoor:Door
 2    {
 3        public void Open()
 4        {
 5            System.Diagnostics.Debug.WriteLine("AgThDoor open;");
 6        }

 7        public void Close()
 8        {
 9            System.Diagnostics.Debug.WriteLine("AgThDoor close;");
10        }

11        public override void AgainstTheft()
12        {
13            System.Diagnostics.Debug.WriteLine("AgThDoor AgainstTheft;");
14            //这个用来防撬
15        }

16    }

   这样好像是没什么问题吧。不过贼就只会撬,砸什么的吗?他还会砍什么的。那有多少种我们就实现多少种AgainstTheft()吧。这个不存在什么问题。
天啊,刚才讨论的仅仅是木门,别忘了世界上可不止一种门。什么木门啊,铁门啊,什么塑料门啊,钢门就别算了。那这么一算是三种门三种防盗方式。 3*3就要实现9个类。估计这时候你要砸键盘了。要是30*30呢人就疯掉了。
  怎么去改进呢,仔细思考一下,我们的Door既有门的功能又有防盗的功能。但是现实还可以是这么一种情况,门只具有门的功能加上防盗器才具有防盗的功能。门和防盗器之间可以自由的组合,那现在好了 30*30 变成 30+30啦。这个世界清净了,不用做这么多傻逼的重复劳动了。
  那重新设计一下吧:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 public abstract class Door
 2    {
 3        protected ITheftAgainstor theftAgainstor;
 4
 5        public void SetTheftAgainstor(ITheftAgainstor obj)
 6        {
 7            theftAgainstor = obj;
 8        }

 9        public void Open()
10        {
11            System.Diagnostics.Debug.WriteLine("base open;");
12        }

13        public void Close()
14        {
15            System.Diagnostics.Debug.WriteLine("base close;");
16        }

17       public void AgainstTheft()
18       {
19           theftAgainstor.AgainstTheft();
20       }

21
22    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1public class WoodDoor : Door
2    {
3        public void AgainstTheft()
4        {
5
6        }

7    }

//防盗器的接口
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 public interface ITheftAgainstor
2    {
3        void AgainstTheft();
4    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1public class StrikeAgainstor:Strategy.ITheftAgainstor
2    {
3      public  void AgainstTheft()
4        {
5            System.Diagnostics.Debug.WriteLine(this.ToString());
6        }

7    }

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 public class ChopAgainstor : ITheftAgainstor
2    {
3        public void AgainstTheft()
4        {
5            System.Diagnostics.Debug.WriteLine(this.ToString());
6        }

7    }

调用代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 Door door = new Strategy.WoodDoor();//造一张木门了。
2            door.SetTheftAgainstor(new StrikeAgainstor());//防砸的
3            door.AgainstTheft();
4
5            door.SetTheftAgainstor(new ChopAgainstor());//防砍的
6            door.AgainstTheft();

                 接下来你可以试试 铁门啊什么的。

     你可能在想,防盗器本身不也是一种现实中实体的集合吗,不也是一种抽象吗。不过自然、人类就是天生的解耦高手,谁知道世界上的第一张防盗门是不是门本身具有防盗功能呢(这个没必要考究了,我本身也怀疑这样的想法,不做个假设又何妨呢),只是在时间和人类的智慧在悄悄的改变这个世界,重构这个世界。防盗的功能也被人类智慧封装到一个叫防盗器的类里面了。程序本身也是对这个世界的模型的一种模拟。如果你觉得下面这个设计本该如此,那么它就是对这个世界的合理的模拟了。
分享到:
评论

相关推荐

    移动公司 吉比特 光猫 ZXHN G6611 路由模式router 改 桥接模式bridge 方法 详细教程

    移动公司吉比特光猫ZXHN G6611路由模式Router改桥接模式Bridge方法详细教程 在这篇教程中,我们将学习如何将移动公司吉比特光猫ZXHN G6611从路由模式(Router)改为桥接模式(Bridge)。这将允许用户使用光猫作为一个...

    设计模式之桥接模式BridgePattern

    桥接模式(Bridge Pattern)是设计模式中的一种结构型模式,它主要解决的是在软件设计中,当抽象和实现之间存在紧密耦合时,如何使这两者能够独立地变化。这种模式通过引入一个抽象层来分离接口和实现,使得它们可以...

    设计模型之桥接模式 bridge C++实现源码,vs2019

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与其实现部分解耦,使得它们可以独立地进行变化和发展。在C++编程中,这种模式的应用可以帮助我们构建灵活、可扩展的系统,尤其在面对...

    Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。在软件工程中,这种分离有助于降低复杂性,提高代码的可维护性和可扩展性。桥接模式的核心...

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    首先,桥接模式(Bridge Pattern)的核心思想是“分离抽象与实现”。它通过建立一个抽象层和一个实现层的独立继承体系,使得抽象部分和实现部分可以独立变化,形成一种解耦的设计。在桥接模式中,抽象类引用实现类的...

    结构型模式之桥接模式(bridge)

    桥接模式是设计模式中的一种结构型模式,其主要目的是为了分离抽象部分和实现部分,以便两者能够独立地进行变化。这种模式的核心理念是通过引入一个抽象层来封装多种可能的实现,使得抽象和实现之间形成一种“桥接”...

    设计模式---桥接模式

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,特别是当需要为同一抽象提供多种实现或者需要独立地改变它们时。 ...

    桥接(bridge)模式

    下面我们将详细探讨桥接模式的概念、结构、优点以及在实际开发中的应用。 桥接模式的核心思想是“抽象”和“实现”的解耦,它通过引入一个抽象层来分离接口和实现,形成两个独立的继承体系。这样,即使在运行时也...

    c++-设计模式之桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得两者可以独立地变化。这种模式常用于需要在多个维度上变化的场景,比如不同的形状和颜色,允许在不改变客户端代码的情况下增加新...

    设计模式的桥接模式的例子

    桥接模式是设计模式中的一种结构型模式,它旨在将抽象部分与实现部分解耦,使得它们可以独立地变化。这种模式将抽象类和它的实现类进行分离,通过一个抽象接口来连接它们,使得两者可以独立发展,增加了系统的灵活性...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式)

    桥接模式(Bridge Pattern)是面向对象设计中的一种结构型模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在C#编程中,桥接模式的应用能够帮助我们更好地解耦系统,提高代码的灵活性和可扩展性。 ...

    python 桥接模式(示例)

    桥接模式 Bridge:将抽象部分与他的实现部分分离,使他们都可以独立的变化合成/聚合复用原则: 尽量使用合成/聚合,尽量不要使用继承解释:什么叫抽象与他的实现分离,并不是说,让抽象类与其派生类分离,因为这就没有任何...

    C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)

    桥接模式(Bridge Pattern)是一种结构型设计模式,它旨在将抽象部分与其实现部分分离,使得它们可以独立地进行变化。在C#编程中,这种模式尤其有用,因为随着软件系统的复杂性增加,类的继承层次可能会变得难以管理...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...

    桥接模式代码示例

    桥接模式是一种设计模式,属于结构型模式,其主要目的是将抽象部分与实现部分分离,使得它们可以独立地进行变化。这种模式通过引入一个抽象化角色来实现抽象和实现的解耦,允许它们独立地扩展。在桥接模式中,抽象...

    ADSL桥接模式和路由模式的区别

    "ADSL 桥接模式和路由模式的区别" 在 ADSL 宽带接入方式中,桥接模式和路由模式是两种常见的工作模式。_bridge 模式是 ADSL ROUTER 的默认工作模式,主要用于单台电脑的接入,需要代理服务器或网关设备将局域网中的...

    Bridge 桥接模式

    C#面向对象设计模式 Bridge 桥接模式 视频讲座下载

    设计模式之桥接模式,内含可运行代码

    在桥接模式中,抽象类(Abstraction)不直接引用具体实现(Implementation),而是通过一个桥接类(Bridge)来引用,这样抽象部分与实现部分可以独立变化,提供了更大的灵活性。 首先,我们来看一下桥接模式的基本...

    桥接模式(Bridge Pattern)原理图

    桥接模式是一种结构型设计模式,它的目的是将抽象化与实现化解耦,使得它们可以独立变化。这种模式主要用于处理当一个类存在两个或多个独立的变化的维度时的情况,例如,当一个类的抽象部分和实现部分可能发生变化,...

    设计模式之桥接模式

    桥接模式(Bridge Pattern)是设计模式中结构型模式的一种,它的主要目的是将抽象部分与实现部分解耦,使得它们可以独立地进行变化。在Java编程中,这种模式的应用可以帮助我们构建更加灵活、可扩展的代码结构。 ...

Global site tag (gtag.js) - Google Analytics