Java 设计模式之桥接模式的详解(结构模式)

桥接模式就是把事物和其具体实现分开,使它们可以各自独立的变化。

桥接的用意是:将抽象化与实现解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

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


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

桥接模式在于将抽象和实现分离(也就是我们常说的解耦),让抽象和实现能够独立。

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

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

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

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

来举个例子:抽象的车,有火车和汽车,而火车有客车和火车,也就是能运货物和人;汽车也是如此,能运货物和运客人。我们可以如下建立模型:


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

上述描述代码如下:


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

上述描述代码如下: 

实现化角色:

运输的接口:

public interface Transport {

	public void transport(); 
}
抽象化角色:

车的抽象类:

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;
	}
}
修正抽象化角色:

汽车的实现类:

public class Car extends Vehicle{

	@Override
	public void transport() {
		// TODO Auto-generated method stub
		System.out.print("汽车");
		 super.transport(); 
	}
}

火车的实现类:

public class Train extends Vehicle{

	@Override
	public void transport() {
		// TODO Auto-generated method stub
		System.out.print("火车");
		 super.transport(); 
	}
}


具体实现化角色:

货车:

public class Goods implements Transport{

	@Override
	public void transport() {
		// TODO Auto-generated method stub
		System.out.println("运货");
	}

}
客车:

public class Guest implements Transport{

	@Override
	public void transport() {
		// TODO Auto-generated method stub
		System.out.println("运客");
	}

}
测试类:

public class Client {

	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 Goods());
		//运输
		car.transport();
	}
}
结果图:


通过上面代码可以看出,桥接模式有如下优点:

1、分离接口及实现部分  一个实现不必一直绑定在一个接口上;

2、提高可扩充性,使扩展变得简单;





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值