黑马程序员技术交流社区

标题: JAVA设计模式学习16——桥梁模式 [打印本页]

作者: 李江    时间: 2013-10-14 09:39
标题: JAVA设计模式学习16——桥梁模式
转自:http://alaric.iteye.com/blog/1918381

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

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


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

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

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

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

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


桥梁模式在于将抽象和实现分离(也就是我们常说的解耦),让抽象和实现能够独立变化。来举个例子:抽象的车,有火车和汽车,而火车有客车和火车,也就是能运货物和人;汽车也是如此,能运货物和运客人。我们可以如下建立模型:

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


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

  • package bridge;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-8-2上午7:41:31
  • *描述:车的抽象类
  • */  
  • public abstract class Vehicle {  
  •   
  •     private Transport implementor;  
  •       
  •     public void transport(){  
  •         implementor.transport();  
  •     }  
  •     public Transport getImplementor() {  
  •         return implementor;  
  •     }  
  •     public void setImplementor(Transport implementor) {  
  •         this.implementor = implementor;  
  •     }  
  •       
  • }  

Java代码  

  • package bridge;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-8-2上午7:45:40
  • *描述:汽车的实现类
  • */  
  • public class Car extends Vehicle {  
  •   
  •     @Override  
  •     public void transport() {  
  •   
  •         System.out.print("汽车");  
  •         super.transport();  
  •     }  
  •   
  • }  

Java代码  

  • package bridge;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-8-2上午7:45:58
  • *描述:火车的实现类
  • */  
  • public class Train extends Vehicle {  
  •   
  •     @Override  
  •     public void transport() {  
  •   
  •         System.out.print("火车");  
  •         super.transport();  
  •     }  
  •   
  • }  

Java代码  

  • package bridge;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-8-2上午7:46:17
  • *描述:车的实现接口
  • */  
  • public interface Transport {  
  •   
  •     /**
  •      *  
  •      *作者:alaric
  •      *时间:2013-8-2上午7:46:38
  •      *描述:运输
  •      */  
  •     public void transport();  
  •       
  • }  

Java代码  

  • package bridge;  
  • /**
  • *  
  • *作者:alaric
  • *时间:2013-8-2上午7:41:00
  • *描述:货车
  • */  
  • public class Goods implements Transport{  
  •   
  •     @Override  
  •     public void transport() {  
  •          
  •         System.out.println("运货");  
  •     }  
  •   
  • }  








作者: 李江    时间: 2013-10-14 09:39
Java代码  
package bridge;  
/**
*  
*作者:alaric
*时间:2013-8-1下午10:58:25
*描述:客车
*/  
public class Guest implements Transport{  
  
    @Override  
    public void transport() {  
  
        System.out.println("运客");  
      
    }  
  
}  

Java代码  
package bridge;  
/**
*  
*作者:alaric
*时间:2013-8-2上午7:45:24
*描述:测试类
*/  
public class Client {  
  
    /**
     *作者:alaric
     *时间:2013-8-2上午7:45:16
     *描述:
     */  
    public static void main(String[] args) {  
        //造出一辆火车来  
        Train train = new Train();  
        //装入货物  
        train.setImplementor(new Goods());  
        //运输  
        train.transport();  
        //上客  
        train.setImplementor(new Guest());  
        //运输  
        train.transport();  
         
         
        //造出一汽车来  
        Car car = new Car();  
        //装入货物  
        car.setImplementor(new Goods());  
        //运输  
        car.transport();  
        //上客  
        car.setImplementor(new Guest());  
        //运输  
        car.transport();  
         
  
    }  
  
}  
运行结果如下:
火车运货
火车运客
汽车运货
汽车运客
通过上面代码可以看出,桥梁模式有如下优点:
1、分离接口及实现部分  一个实现不必一直绑定在一个接口上;
2、提高可扩充性,使扩展变得简单;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2