前言
本章讲解桥接模式的相关知识
方法
1.概念
在讲解桥接模式之前,我们先来了解一下生活中的常见例子:
桥梁类型,按用途分,有铁路桥、公路桥、公铁两用桥、人行桥、运水桥(渡槽)及其他专用桥梁(如通过管道、电缆等)。按跨越障碍分,有跨河桥、跨谷桥、跨线桥(又称立交桥)、高架桥、栈桥等。
如果用Java中的类该如何表示呢?
我们可以设计一个桥类,桥类下面有铁路桥、公路桥、人行桥三个子类,其中铁路桥下面有跨河铁路桥、跨河公路桥、跨河人行桥三个子类,公路桥和人行桥各有三个类似的子类,当然这很容易表示。
但是,上面的设计如果增加一种桥梁的用途或者增加跨越障碍类别的话,那么势必需要再次添加三个子类,扩展性极差!
为了解决类爆炸的问题,Java中提供了桥接模式的解决办法。
2.桥接模式的实现思路
1)首先建立相应工程
2)编写桥梁抽象类
其中Bridge是桥梁抽象类,按用途分了三种桥梁类分别继承这个抽象类,代码如下:
package cn.edu.ccut;
/**
* 桥梁抽象类,按照用途分
* @author jwang
*
*/
public abstract class Bridge {
protected Obstacle obstacle;
public Bridge(Obstacle obstacle) {
obstacle.say();
this.obstacle = obstacle;
}
public abstract void say();
}
/**
* 铁路大桥
* @author jwang
*
*/
class TL extends Bridge{
public TL(Obstacle obstacle) {
super(obstacle);
}
@Override
public void say() {
System.out.println("铁路大桥");
}
}
/**
* 公路大桥
* @author jwang
*
*/
class GL extends Bridge{
public GL(Obstacle obstacle) {
super(obstacle);
}
@Override
public void say() {
System.out.println("公路大桥");
}
}
/**
* 人行大桥
* @author jwang
*
*/
class RX extends Bridge{
public RX(Obstacle obstacle) {
super(obstacle);
}
@Override
public void say() {
System.out.println("人行大桥");
}
}
3)编写跨越障碍类接口
Obstacle是一个接口,用来表示跨越障碍的类别接口,按照跨越障碍的不同有三个子类实现了这个接口。
package cn.edu.ccut;
/**
* 跨越障碍接口,按跨越障碍分
* @author jwang
*
*/
public interface Obstacle {
void say();
}
/**
* 跨河大桥
* @author jwang
*
*/
class KH implements Obstacle{
@Override
public void say() {
System.out.println("跨河大桥");
}
}
/**
* 跨谷大桥
* @author jwang
*
*/
class KG implements Obstacle{
@Override
public void say() {
System.out.println("跨谷大桥");
}
}
/**
* 跨线大桥
* @author jwang
*
*/
class KX implements Obstacle{
@Override
public void say() {
System.out.println("跨线大桥");
}
}
4)编写测试类测试
package cn.edu.ccut;
public class Test {
public static void main(String[] args) {
//跨河铁路桥
Bridge bridge = new TL(new KH());
bridge.say();
}
}
由此可见,当我们需要跨海铁路桥的时候,仅仅使用组合的方式代替了以前传统的类继承体系。
运行结果如下:
由于Java中没有多继承,故不得已使用此模式来缓解项目中类爆炸的问题。
这样的话,以后新增一种桥梁的用途或者增加一种跨越障碍的类别,都是可以轻松解决的,不再需要繁琐的继承了。