JAVA设计模式学习16——桥梁模式

2019-03-08 09:31|来源: 网络

桥梁(Bridge)模式:又称Handle/Body。将抽象部分和实现部分分离,使它们都可以独立的变化。桥梁模式属于对象的结构模式。

GOF桥梁模式的示意性结构类图如下:


通过上图可以看出桥梁模式有以下角色:    

抽象化(Abstraction)角色:给出抽象化定义并持有一个实现化对象的引用。

修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。

实现化(Implementor)角色:给出实现化的接口角色的接口,但不给出具体的实现。

具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

桥梁模式在于将抽象和实现分离(也就是我们常说的解耦),让抽象和实现能够独立变化。来举个例子:抽象的车,有火车和汽车,而火车有客车和火车,也就是能运货物和人;汽车也是如此,能运货物和运客人。我们可以如下建立模型:    
   
 这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。
 上述描述代码如下:

     
这种模式将车的属性和行为分类,让车 和运输相互独立演变,类的数量由原来的M*N变成M+N的数量,利用组合方式代替继承,这也符合‘组合聚合复用原则’,组合聚合复用原则讲的是要尽可能使用组合、聚合来达到复用目的而不是利用继承。对于增加一个运输方式或者增加一个车的种类,直接添加即可,不必修改其他类,也只需修改一处即可。上述描述代码如下:
Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:41:31

  6. *描述:车的抽象类

  7. */  

  8. public abstract class Vehicle {  

  9.  

  10.    private Transport implementor;  

  11.      

  12.    public void transport(){  

  13.        implementor.transport();  

  14.    }  

  15.    public Transport getImplementor() {  

  16.        return implementor;  

  17.    }  

  18.    public void setImplementor(Transport implementor) {  

  19.        this.implementor = implementor;  

  20.    }  

  21.      

  22. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:45:40

  6. *描述:汽车的实现类

  7. */  

  8. public class Car extends Vehicle {  

  9.  

  10.    @Override  

  11.    public void transport() {  

  12.  

  13.        System.out.print("汽车");  

  14.        super.transport();  

  15.    }  

  16.  

  17. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:45:58

  6. *描述:火车的实现类

  7. */  

  8. public class Train extends Vehicle {  

  9.  

  10.    @Override  

  11.    public void transport() {  

  12.  

  13.        System.out.print("火车");  

  14.        super.transport();  

  15.    }  

  16.  

  17. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:46:17

  6. *描述:车的实现接口

  7. */  

  8. public interface Transport {  

  9.  

  10.    /**

  11.     *

  12.     *作者:alaric

  13.     *时间:2013-8-2上午7:46:38

  14.     *描述:运输

  15.     */  

  16.    public void transport();  

  17.      

  18. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:41:00

  6. *描述:货车

  7. */  

  8. public class Goods implements Transport{  

  9.  

  10.    @Override  

  11.    public void transport() {  

  12.          

  13.        System.out.println("运货");  

  14.    }  

  15.  

  16. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-1下午10:58:25

  6. *描述:客车

  7. */  

  8. public class Guest implements Transport{  

  9.  

  10.    @Override  

  11.    public void transport() {  

  12.  

  13.        System.out.println("运客");  

  14.      

  15.    }  

  16.  

  17. }  

Java代码
  1. package bridge;  

  2. /**

  3. *

  4. *作者:alaric

  5. *时间:2013-8-2上午7:45:24

  6. *描述:测试类

  7. */  

  8. public class Client {  

  9.  

  10.    /**

  11.     *作者:alaric

  12.     *时间:2013-8-2上午7:45:16

  13.     *描述:

  14.     */  

  15.    public static void main(String[] args) {  

  16.        //造出一辆火车来  

  17.        Train train = new Train();  

  18.        //装入货物  

  19.        train.setImplementor(new Goods());  

  20.        //运输  

  21.        train.transport();  

  22.        //上客  

  23.        train.setImplementor(new Guest());  

  24.        //运输  

  25.        train.transport();  

  26.          

  27.          

  28.        //造出一汽车来  

  29.        Car car = new Car();  

  30.        //装入货物  

  31.        car.setImplementor(new Goods());  

  32.        //运输  

  33.        car.transport();  

  34.        //上客  

  35.        car.setImplementor(new Guest());  

  36.        //运输  

  37.        car.transport();  

  38.          

  39.  

  40.    }  

  41.  

  42. }  



运行结果如下:
     火车运货
 火车运客
     汽车运货
     汽车运客
 通过上面代码可以看出,桥梁模式有如下优点:
1、分离接口及实现部分  一个实现不必一直绑定在一个接口上;    
2、提高可扩充性,使扩展变得简单;    

 
转自:http://alaric.iteye.com/blog/1918381

相关问答

更多
  • 其实我相信你做了3年的java一定了解你所说的设计模式和反射机制在程序早已用过了的把,只是自己平时没注意;设计模式主要是用项目管理,让人看起来通俗易懂.反射机制用到的地方呢也比较多,在用properties和JFreeChart等地方都用到.
  • 模式开扩了我们的视野,强化了我们面向对象编程的思维方式 提高代码的复杂度为代价来增强灵活性、可复用性 工厂模式根据工厂模式实现的类可以根据提供的数据 生成一组类中某一个类的实例,通常这组类有一个公共的 抽象父类或接口并且实现了相同的方法,但是这些方法针对不同 的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了 基类中的方法,然后需要定义一个工厂类,工厂类可以根据 条件生成不同子类的实例。 得到实例后,可以调用基类的方法而不必考虑到底 返回的是哪个子类的实例。 Factory(工厂 ...
  • 马学兵视频,W3C 教程,硅谷动力 视频教程等 先看视频,然后跟着做一遍。 最后下载一个 源码,尝试着模仿做几个 基本算入门了
  • 你是准备学习使用 还是说研究它的底层实现机制这些东西? 如果只是使用 可以暂时不了解这些 ,你也没有这么多精力来了解这么多 你先将框架中的东西用熟练 然后再去了解这些也不迟 spring 的 IOC aop hibernate的 延迟加载 缓存 ,mvc这些学习都需要学习 其实你学习不学习这几个框架都可以对设计模式进行学习 设计模式在日常的版本开发中好处很多 而且在面试的时候 考官也会问设计模式方面的知识
  • 一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。 创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。 创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder Pattern)  原 ...
  • 一般来说电驴(verycd)里面可以下载,那里面的资源很多。希望这个对你有帮助
  • java mvc设计模式[2022-08-26]

    MVC模式写的 有是有 不过里面加入了简单工厂模式 呵呵不知道你要不要
  • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 java设计模式是当你在实际的系统当中遇到重构或者扩展的时候采取的一种对现有系统影响最小的一种措施。当然并不是一定要学这个东西,就像一个没上过学的人和上过学的人,在个人修养上面存在一定的差异,但是他们都 ...