JAVA化境(七)设计模式之桥接设计模式

版权声明:程序猴jwang版权所有 https://blog.csdn.net/qq_21046965/article/details/91629640

前言

      本章讲解桥接模式的相关知识

方法

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中没有多继承,故不得已使用此模式来缓解项目中类爆炸的问题。

这样的话,以后新增一种桥梁的用途或者增加一种跨越障碍的类别,都是可以轻松解决的,不再需要繁琐的继承了。 

猜你喜欢

转载自blog.csdn.net/qq_21046965/article/details/91629640