java设计模式之-----桥接模式

一、概念定义

  将抽象部分和实现部分分离,使他们都可以独立的变化。(这句话有点抽象啊。。)

  在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又不增加复杂度,这就要引入“Bridge”桥接模式。

二、模式角色

  

  Abstraction:

  1.定义抽象接口;

  2.拥有一个Impl类型对象引用。

  RefinedAbstraction

  1.扩展Abstraction的接口定义;

  Implementor

  1.Implementor是具体实现的接口,Implementor和Abstraction接口并不一定完全一致(注:Proxy和ISubject接口一一对应),实际上这两个接口可以完全不一样,Implementor提供具体操作方法,而Abstraction提供更高层次的调用。

  ComcreteImplementor

  1.实现Implementor接口,给出具体实现;

三、实例

  我们利用汽车在不同道路上行驶的例子来讲解:

  汽车:小轿车,公交车

  道路:市区街道,高速公路

  (我们还可以增加一个维度,驾驶者:男人,女人···)

传统实现(类继承):

上面的实现,导致类的结构过于复杂,继承关系太多,难以维护,扩展性太差,仅仅当汽车类型和道路变化 ,就会使类的结构更大。

利用桥接模式的实现:

而利用桥接模式,把两个角色之间的关系由继承改为了耦合的关系;从而使两者可以自由的变化。

抽象类:【代码清单---1】

 1 package com.huawei.bridgeDesign01.Abstract;
 2 /**
 3  * 抽象汽车
 4  * @author Administrator
 5  *
 6  */
 7 public abstract class AbstractCar
 8 {
 9     public abstract void run();
10 }
11 ========================
12 package com.huawei.bridgeDesign01.Abstract;
13
14 /**
15  * 抽象道路
16  * @author Administrator
17  *
18  */
19 public abstract class AbstractRoad
20 {
21     public AbstractCar aCar;
22
23     public abstract void run();
24
25     public AbstractCar getaCar() {
26         return aCar;
27     }
28
29     public void setaCar(AbstractCar aCar) {
30         this.aCar = aCar;
31     }
32 }
33 ===============================
34 package com.huawei.bridgeDesign01.Abstract;
35
36 /**
37  * 抽象驾驶者
38  * @author Administrator
39  *
40  */
41 public abstract class People
42 {
43     public AbstractRoad road;
44     public abstract void run();
45 }

具体实现类【代码清单---2】

汽车类:

 1 package com.huawei.bridgeDesign01.Impl;
 2
 3 /**
 4  * 公交车实现类
 5  */
 6 import org.apache.log4j.Logger;
 7
 8 import com.huawei.bridgeDesign01.Abstract.AbstractCar;
 9
10 public class Bus extends AbstractCar
11 {
12     public static final Logger LOGGER = Logger.getLogger(Bus.class);
13
14     @Override
15     public void run()
16     {
17         LOGGER.info("公交车");
18     }
19 }
20 ===============================
21 package com.huawei.bridgeDesign01.Impl;
22 /**
23  * 小汽车实现类
24  */
25 import org.apache.log4j.Logger;
26
27 import com.huawei.bridgeDesign01.Abstract.AbstractCar;
28
29 public class Car extends AbstractCar
30 {
31     public static final Logger LOGGER = Logger.getLogger(Car.class);
32
33     @Override
34     public void run()
35     {
36         LOGGER.info("小汽车");
37     }
38 }

道路类【代码清单---3】

 1 package com.huawei.bridgeDesign01.Impl;
 2 /**
 3  * 高速公路具体类
 4  */
 5 import org.apache.log4j.Logger;
 6
 7 import com.huawei.bridgeDesign01.Abstract.AbstractRoad;
 8
 9 public class SpeedWay extends AbstractRoad
10 {
11     public static final Logger LOGGER = Logger.getLogger(SpeedWay.class);
12
13     @Override
14     public void run()
15     {
16         aCar.run();
17         LOGGER.info("在高速公路上行驶");
18     }
19 }
20 =====================================
21 package com.huawei.bridgeDesign01.Impl;
22 /**
23  * 市区街道具体类
24  */
25 import org.apache.log4j.Logger;
26
27 import com.huawei.bridgeDesign01.Abstract.AbstractRoad;
28
29 public class Street extends AbstractRoad
30 {
31     public static final Logger LOGGER = Logger.getLogger(Street.class);
32     @Override
33     public void run()
34     {
35         aCar.run();
36         LOGGER.info("在市区街道行驶");
37     }
38 }

驾驶者类【代码清单---4】

 1 package com.huawei.bridgeDesign01.Impl;
 2 /**
 3  * 男人具体类
 4  */
 5 import org.apache.log4j.Logger;
 6
 7 import com.huawei.bridgeDesign01.Abstract.People;
 8
 9 public class Man extends People
10 {
11     public static final Logger LOGGER = Logger.getLogger(People.class);
12     @Override
13     public void run()
14     {
15         LOGGER.info("男人开着");
16         road.run();
17     }
18 }
19 =================================
20 package com.huawei.bridgeDesign01.Impl;
21 /**
22  * 女人具体类
23  */
24 import org.apache.log4j.Logger;
25
26 import com.huawei.bridgeDesign01.Abstract.People;
27
28 public class Women extends People
29 {
30     public static final Logger LOGGER = Logger.getLogger(Women.class);
31     @Override
32     public void run()
33     {
34         LOGGER.info("女人开着");
35         road.run();
36     }
37 }

测试类【代码清单---5】

 1 package com.huawei.bridgeDesign01;
 2
 3 import org.apache.log4j.Logger;
 4
 5 import com.huawei.bridgeDesign01.Abstract.AbstractRoad;
 6 import com.huawei.bridgeDesign01.Abstract.People;
 7 import com.huawei.bridgeDesign01.Impl.Bus;
 8 import com.huawei.bridgeDesign01.Impl.Car;
 9 import com.huawei.bridgeDesign01.Impl.Man;
10 import com.huawei.bridgeDesign01.Impl.SpeedWay;
11 import com.huawei.bridgeDesign01.Impl.Street;
12 import com.huawei.bridgeDesign01.Impl.Women;
13
14 public class Main02
15 {
16     public static final Logger LOGGER = Logger.getLogger(Main02.class);
17
18     public static void main(String[] args)
19     {
20         LOGGER.info("Enter Main02.class...");
21         AbstractRoad speedWay = new SpeedWay();
22         speedWay.aCar = new Car();
23         People man = new Man();
24         man.road = speedWay;
25         man.run();
26
27         AbstractRoad  street = new Street();
28         street.aCar = new Bus();
29         People women = new Women();
30         women.road = street;
31         women.run();
32         LOGGER.info("Exit Main02.class....");
33     }
34 }

四、效果及实现要点

1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着自己的方向来变化;

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

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

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

五、应用及拓展

适用性:

1.如果一个软件系统需要在抽象角色和具体实现之间增加更多的灵活性;

2.设计要求具体化角色的任何改变不影响客户端,或者说具体化角色的改变对客户端来说是完全透明的;

3.一个系统有多个抽象画角色和实现化角色,系统需要他们之间进行动态耦合;

与装饰者模式的区别:

这两个类都是为了减少子类的数目,避免出现复杂的类继承关系。

装饰者模式:装饰者模式是把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要。当我们

把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现

很多的功能组合。

桥接模式:它把原来的基类的实现化细节抽象出来,再构造一个实现化的结构中,然后把原来的基类改造成

一个抽象化的等级结构,这样就可以实现在多个维度上的独立自由变化。

六、后期补充

时间: 2024-12-09 22:19:59

java设计模式之-----桥接模式的相关文章

图解Java设计模式之桥接模式

图解Java设计模式之桥接模式 手机操作问题 传统方案解决手机操作问题 传统方案解决手机操作问题分析 桥接模式(Bridge)-基本介绍 桥接模式解决手机操作问题 桥接模式在JDBC中的源码解析 桥接模式的注意事项和细节 桥接模式其它应用场景 手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如 :开机.关机.上网.打电话等等),如图 : 传统方案解决手机操作问题 传统方法对应的类图 传统方案解决手机操作问题分析 1)扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各

Java设计模式:桥接模式

问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何来描述这些功能呢?或许一般会与下面代码相似. public class A1 { void F1(){} void F2(){} } public class A2 { void F1(){} void F2(){} } 很明显,若有m个事物,n个功能,按照这个方法,一共要写m个类,功能方法累积起来

java设计模式之桥接模式

桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类.这两种类型的类可被结构化改变而互不影响.我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法.其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆. 桥接模式所涉及的角色有:抽象化(Abstraction)角色:抽象化给出的

java设计模式_桥接模式

现在的手机,按照操作系统分,有ios,有android,还有window phone等. 如果是按软件来分的话,就有通讯录,游戏等. 按继承的思维来考虑的话,如下: 但是问题来了,如果是按照手机品牌来分的话,增加一个新的手机品牌的话,意味着不仅要增加手机品牌,还要增加改手机品牌的通讯录和游戏. 若按照手机软件来分的话,同样,增加一个新的软件的话,意味着不仅要增加新的软件,还要增加各个品牌手机对应的通讯录和游戏. 通过桥接模式的话,若增加软件,则只需要增加软件即可,若增加品牌,只需增加品牌即可.

Java设计模式应用——桥接模式

性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也可以是mppdb入库. 针对不同场景,我们可以灵活选择不同的采集,汇聚,入库方式.这种一个功能需要多种服务支持,每种服务又有不同类型的实现,使用桥接模式再适合不过. (注:这里仅仅是桥接模式的例子,实际应用中,采集.汇聚.入库时异步执行的,他们之间通过消息通信) 桥接模式,顾名思义,就是把每种服务看

JAVA设计模式之 桥接模式【Bridge Pattern】

一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式. 二.适用场景 处理多维度变化. 业务场景:某功能为将数据库中的数据转换成多种文件格式,例如txt.xml.pdf等格式,同时需要支持多种不同类型的数据库的读取.便可使用桥接模式对其进行设计. 这里的维度有两个 分别为:不同的文件格式 和 不同的数据库类型.如下图: 三.UML类图 桥接模式通用结构图: 针对上面的业务场景-桥接模式-示例结构图: 四.参与者

浅谈JAVA设计模式之——桥接模式(Bridge)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45457969 一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充. 这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充. 3.对一

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

设计模式之桥接模式

桥接模式:实现系统可能有多角度分类,每一种分类都有可能的变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合 下面的实例是一个手机软件的实例,对于手机来说,我们可以从手机的品牌进行分类,也可以从软件角度分类(功能机),同时手机品牌与手机软件是一个 聚合的关系. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadi