一、概念定义

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

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

二、模式角色

  

  Abstraction:

  1.定义抽象接口;

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

  RefinedAbstraction

  1.扩展Abstraction的接口定义;

  Implementor

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

  ComcreteImplementor

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

三、实例

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

  汽车:小轿车,公交车

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

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

传统实现(类继承):

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

利用桥接模式的实现:

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

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

 package com.huawei.bridgeDesign01.Abstract;
/**
* 抽象汽车
* @author Administrator
*
*/
public abstract class AbstractCar
{
public abstract void run();
}
========================
package com.huawei.bridgeDesign01.Abstract; /**
* 抽象道路
* @author Administrator
*
*/
public abstract class AbstractRoad
{
public AbstractCar aCar; public abstract void run(); public AbstractCar getaCar() {
return aCar;
} public void setaCar(AbstractCar aCar) {
this.aCar = aCar;
}
}
===============================
package com.huawei.bridgeDesign01.Abstract; /**
* 抽象驾驶者
* @author Administrator
*
*/
public abstract class People
{
public AbstractRoad road;
public abstract void run();
}

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

汽车类:

 package com.huawei.bridgeDesign01.Impl;

 /**
* 公交车实现类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.AbstractCar; public class Bus extends AbstractCar
{
public static final Logger LOGGER = Logger.getLogger(Bus.class); @Override
public void run()
{
LOGGER.info("公交车");
}
}
===============================
package com.huawei.bridgeDesign01.Impl;
/**
* 小汽车实现类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.AbstractCar; public class Car extends AbstractCar
{
public static final Logger LOGGER = Logger.getLogger(Car.class); @Override
public void run()
{
LOGGER.info("小汽车");
}
}

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

 package com.huawei.bridgeDesign01.Impl;
/**
* 高速公路具体类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.AbstractRoad; public class SpeedWay extends AbstractRoad
{
public static final Logger LOGGER = Logger.getLogger(SpeedWay.class); @Override
public void run()
{
aCar.run();
LOGGER.info("在高速公路上行驶");
}
}
=====================================
package com.huawei.bridgeDesign01.Impl;
/**
* 市区街道具体类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.AbstractRoad; public class Street extends AbstractRoad
{
public static final Logger LOGGER = Logger.getLogger(Street.class);
@Override
public void run()
{
aCar.run();
LOGGER.info("在市区街道行驶");
}
}

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

 package com.huawei.bridgeDesign01.Impl;
/**
* 男人具体类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.People; public class Man extends People
{
public static final Logger LOGGER = Logger.getLogger(People.class);
@Override
public void run()
{
LOGGER.info("男人开着");
road.run();
}
}
=================================
package com.huawei.bridgeDesign01.Impl;
/**
* 女人具体类
*/
import org.apache.log4j.Logger; import com.huawei.bridgeDesign01.Abstract.People; public class Women extends People
{
public static final Logger LOGGER = Logger.getLogger(Women.class);
@Override
public void run()
{
LOGGER.info("女人开着");
road.run();
}
}

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

 package com.huawei.bridgeDesign01;

 import org.apache.log4j.Logger;

 import com.huawei.bridgeDesign01.Abstract.AbstractRoad;
import com.huawei.bridgeDesign01.Abstract.People;
import com.huawei.bridgeDesign01.Impl.Bus;
import com.huawei.bridgeDesign01.Impl.Car;
import com.huawei.bridgeDesign01.Impl.Man;
import com.huawei.bridgeDesign01.Impl.SpeedWay;
import com.huawei.bridgeDesign01.Impl.Street;
import com.huawei.bridgeDesign01.Impl.Women; public class Main02
{
public static final Logger LOGGER = Logger.getLogger(Main02.class); public static void main(String[] args)
{
LOGGER.info("Enter Main02.class...");
AbstractRoad speedWay = new SpeedWay();
speedWay.aCar = new Car();
People man = new Man();
man.road = speedWay;
man.run(); AbstractRoad street = new Street();
street.aCar = new Bus();
People women = new Women();
women.road = street;
women.run();
LOGGER.info("Exit Main02.class....");
}
}

四、效果及实现要点

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

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

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

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

五、应用及拓展

适用性:

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

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

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

与装饰者模式的区别:

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

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

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

很多的功能组合。

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

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

六、后期补充

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

  1. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  2. java设计模式之桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦.这种模式涉及到一个作为桥接的 ...

  3. Java设计模式:桥接模式

    问题提出 生活中有很多事物集合,设为A1,A2......Am ,而每个事物都有功能F1,F2....Fn. 例如邮局的发送业务.简单模拟有两类事物:信件和包裹,均有平邮和挂号邮寄功能.程序设计中如何 ...

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

    性能管理系统中,数据产生后需要经过采集,汇聚,入库三个流程,用户才能查询使用. 采集可以是snmp采集,也可以是ems采集:汇聚可以使storm汇聚,也可以是spark汇聚:入库可以是hdfs入库,也 ...

  5. JAVA设计模式之桥接模式(bridge)

    桥接模式: 分离抽象与具体实现,让他们可以独自发展,防止类爆炸 场景: 过年走亲戚是我们中国人传统的习俗,走亲戚那就少不了要买东西(苹果,牛奶等等),这些具体的东西就是具体的类 蒙牛牛奶,有机苹果,有 ...

  6. 八戒转世投胎竟然是Java设计模式:桥接模式

    目录 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比如有 ...

  7. java面试题之----jdbc中使用的设计模式(桥接模式)

    1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...

  8. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  9. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

随机推荐

  1. json与对象转化

    /// <summary> /// 把JSON字符串还原为对象 /// </summary> /// <typeparam name="T">对 ...

  2. myBatis,Spring,SpringMVC三大框架ssm整合模板

    整合步骤 创建web工程 导入整合所需的所有jar包 编写各层需要的配置文件 1) mybatis的全局配置文件 <configuration>    <!-- 批量别名的设置 -- ...

  3. web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入

    web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...

  4. chrome调试hove等类似事件

    前台开发过程中经常会用chrome调试代码.但是有的时候,hover或者js控制的属性显示不全 解决办法有两种: 1.根据chrome版本不一样(检查两个字)可能会有所差别 2.图中有标记

  5. C语言乱谈(一) 20行代码生成BMP

    在学习图形图像的过程中,最简单和常见的格式是BMP和PPM.下面将给出生成BMP的极度精简代码,然后讲解BMP格式. #include <stdio.h> #include <std ...

  6. LDAP与jenkins

    1:下载:jenkins.war 2:运行:java -jar jenkins.war  一直让他开着,后者放到后台进程 3:在浏览器输入http://IP:8080   4:设置LDAP     若 ...

  7. strcpy(),strcat()的用法

    strcpy(): 定义一个字符串char a[20],和一个字符串c[]="i am a teacher!"; 把c复制到a中就可以这样用:strcpy(a,c); 这个函数包含 ...

  8. 使用CSS3动画库animate.css

    IE9及更早版本的IE浏览器都不支持css3动画 谷歌浏览器.火狐浏览器.IE10+浏览器以及移动端浏览器等这些都支持css3动画 animate.css内置了很多典型的css3动画   用法   1 ...

  9. python 2.4 与 python 3.0 的比较

    转过来,留着日后查看 [转自:]http://hi.baidu.com/autoitcn/blog/item/5f41973294b5fc4fac4b5f77.html python 2.4 与 py ...

  10. Oracle存储过程记录异常

    --建立错误日志表 create table PUB_PROC_ERR_LOG ( LOG_ID NUMBER, MODULE_NAME ), PROC_NAME ), ERR_TIME DATE, ...