22桥接模式(Bridge Pattern)

动机(Motivate):
    在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?

意图(Intent):
    
将抽象部分与实现部分分离,使它们都可以独立的变化。
                                  ------《设计模式》GOF
结构图(Struct):
                   

生活中的例子:      

    我想大家小时候都有用蜡笔画画的经历吧。红红绿绿的蜡笔一大盒,根据想象描绘出格式图样。而毛笔下的国画更是工笔写意,各展风采。而今天我们的故事从蜡笔与毛笔说起。

    设 想要绘制一幅图画,蓝天、白云、绿树、小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦。毕竟细细的蜡笔要涂出一片蓝天,是有些麻烦。如果有可能, 最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成。至于色彩吗,最好每种颜色来支粗的,除了蓝天还有绿地呢。这样,如果一套12种颜色的蜡笔,我们需要两套 24支,同种颜色的一粗一细。呵呵,画还没画,开始做梦了:要是再有一套中号蜡笔就更好了,这样,不多不少总共36支蜡笔。

 

           

   再看看毛笔这一边,居然如此简陋:一套水彩12色,外加大中小三支毛笔。你可别小瞧这"简陋"的组合,画蓝天用大毛笔,画小鸟用小毛笔,各具特色。

 

          

       呵呵,您是不是已经看出来了,不错,我今天要说的就是Bridge模式。为了一幅画,我们需要准备36支型号不同的蜡笔,而改用毛笔三支就够了,当 然还要搭配上12种颜料。通过Bridge模式,我们把乘法运算3×12=36改为了加法运算3+12=15,这一改进可不小。那么我们这里蜡笔和毛笔到 底有什么区别呢?

    实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。【GOF95】桥梁模式的用意是"将抽象化 (Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不 开的,所以就造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是: "毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝等12种,于是便可出现3×12种组合。每个参与者(毛笔与颜料)都可以在自己的自由度 上随意转换。

    蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。  

代码实现: 
    

1   abstract class Brush
2     {
3         protected Color c;
4         public abstract void Paint();
5 
6         public void SetColor(Color c)
7         { this.c = c; }
8     }


 

1   class BigBrush : Brush
2     {
3         public override void Paint()
4         { Console.WriteLine("Using big brush and color {0} painting", c.color); }
5     }

 

1   class SmallBrush : Brush
2     {
3         public override void Paint()
4         { Console.WriteLine("Using small brush and color {0} painting", c.color); }
5     }

 

1   class Color
2     {
3         public string color;
4     }

 

1 class Red : Color
2     {
3         public Red()
4         { this.color = "red"; }
5     }

 

1    class Green : Color
2     {
3         public Green()
4         { this.color = "green"; }
5     }

 

1   class Blue : Color
2     {
3         public Blue()
4         { this.color = "blue"; }
5     }

 

 1     class Program
 2     {
 3    public static void Main()
 4   {
 5     Brush b = new BigBrush();
 6     b.SetColor(new Red());
 7     b.Paint();
 8     b.SetColor(new Blue());
 9     b.Paint();
10     b.SetColor(new Green());
11     b.Paint();
12 
13     b = new SmallBrush();
14     b.SetColor(new Red());
15     b.Paint();
16     b.SetColor(new Blue());
17     b.Paint();
18     b.SetColor(new Green());
19     b.Paint();
20   }


适用性:   
   1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。

      2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

      3 .一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。

      4 .虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

Bridge要点:   
     1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。

        2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同平台上的不同型号。

        3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

        4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql动静分离_haproxy的web服务负载均衡、动静分离、 MySQL服务负载均衡、状态监控...

实验环境:基于centos6.6haproxy-Server:172.16.249.98 hostname:node1upsteram server1:172.16.249.100 hostname:node2upstream server2:172.16.249.99 hostname:node3web服务的负载均衡以及状态监控:设置记录hapro…

24组合模式(Composite Pattern)

动机(Motivate): 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。意图(Intent): 将对象组合…

23装饰模式(Decorator Pattern)

子类复子类,子类何其多 假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能;比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等。 按类继承的作法…

gb2312编码在线转换_python基础学习—04字符串与编码

点击上方蓝字关注我们不迷路!字符串与编码一、了解计算机编码1.1 编码定义:将信息从一种形式转换为另外一种形式的过程叫做编码,即信息转换过程举例:信息加密解密、语言翻译1.2 计算机编码定义:将计算机可读信息转换…

25外观模式(Facade Pattern)

动机(Motivate): 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦&#…

mysql mybatis类型对应_Mybatis与数据库的类型对应

Mybatis与数据库的类型对应由于业务的改变,在首次存入数据库时某些int属性并没有赋值,于是默认值就开始污染数据库了。java实体属性对应mysql和SQL Server 和Oracle 数据类型对应1:Java数据类型与MySql数据类型对照表*对于bolb,一…

26享元模式(Flyweight Pattern)

面向对象的代价 面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能。但是,在 某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销。比如: 图形应用…

mysql一个事务多个log_MySQL识别一个binlog中的一个事物

MySQL测试版本5.7.14设置GTID_MODEONON(3): Both new and replicated transactions must be GTID transactions(生成的是GTID事物,slave也只能应用GTID事物)设置binlog格式为row模式做如下操作mysql> insert into test values(1,2);Query OK, 1 row affected (0.…

go for 循环遍历数组并排序_10. Go语言流程控制:for 循环

本文原文:http://golang.iswbm.comGithub:http://github.com/iswbm/GolangCodingTimeGo里的流程控制方法还是挺丰富,整理了下有如下这么多种:if - else 条件语句switch - case 选择语句for - range 循环语句goto 无条件跳转语句de…

27代理模式(Proxy Pattern)

直接与间接: 人们对复杂的软件系统常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活、 满足特定需求的解决方案。 …

31模板方法(Template Method)

无处不在的Template Method 如果你只想掌握一种设计模式,那么它就是Template Method! 动机(Motivate): 变化 -----是软件设计的永恒主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何 分析,并发现系统中…

bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析

1、 Apache Tomcat的下载和安装从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件,下载的文件格式可以是zip/tar.gz/exe形式的。如下图所示,在64位windows中使用tomcat,我们可以下载"64-bit Windows.zip",直接解…

33迭代器模式(Iterator Pattern)

动机(Motivate): 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作…

32命令模式(Command Pattern)

耦合与变化: 耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。 动机(Mot…

34观察者模式(Observer Pattern)

动机(Motivate):在软件构建 过程中,我们需要为某些对象建立一种“通知依赖关系” --------一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密&#x…

36中介者模式(Mediator Pattern)

依赖关系的转化: 动机(Motivate): 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。 在这种情况…

相似理论与模型试验_正交实验下的固液耦合相似材料研究

原标题:基于正交试验的固液耦合相似材料研究摘 要:为了研究矿井突水演化规律,通过正交试验研制出一种能同时满足固体力学与水理性的固液 耦合相似材料,该相似材料以河沙为骨料、水泥和大白粉为胶结剂、液体石蜡和淀粉为调节剂。采用 极差分析…

35解释器模式(Interpreter Pattern)

动机(Motivate): 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种文法规则下的句子,…

37职责链模式(Chain of Responsibility Pattern)

动机(Motivate): 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…

python3中format函数列表_Python3之字符串格式化format函数详解(上)

173.jpg概述在Python3中,字符串格式化操作通过format()方法或者fstring实现。而相比于老版的字符串格式化方式,format()方法拥有更多的功能,操作起来更加方便,可读性也更强。该函数将字符串当成一个模板,通过传入的参数…