设计模式学习笔记——桥接(Bridge)模式

学习桥接模式时,参考了云飞龙行的“研磨设计模式之桥接模式”一文,感觉作者讲得很好,清晰易懂。

该文地址:http://www.cnblogs.com/sjms/archive/2010/09/01/1814718.html

桥接模式:

定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。所谓桥接,通俗点说就是在不同的东西之间搭一个桥,让他们能够连接起来,可以相互通讯和使用。那么在桥接模式中到底是给什么东西来搭桥呢?就是为被分离了的抽象部分和实现部分来搭桥。在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,而不能反过来,也就是个单向桥。

模式结构和说明:

2010090609125164

说明:

Abstraction:

抽象部分的接口。通常在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象里面的方法,通常都是跟具体的业务相关的方法。

RefinedAbstraction:

扩展抽象部分的接口,通常在这些对象里面,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分的对象来完成。

Implementor:

定义实现部分的接口,这个接口不用和Abstraction里面的方法一致,通常是由Implementor接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作。

ConcreteImplementor:

真正实现Implementor接口的对象。

(1)先看看Implementor接口的定义,示例代码如下:

/**
 * 定义实现部分的接口,可以与抽象部分接口的方法不一样
 */
public interface Implementor {
	/**
	 * 示例方法,实现抽象部分需要的某些具体功能
	 */
	public void operationImpl();
}

(2)再看看Abstraction接口的定义,注意一点,虽然说是接口定义,但其实是实现成为抽象类。示例代码如下:

/**
 * 定义抽象部分的接口
 */
public abstract class Abstraction {
	/**
	 * 持有一个实现部分的对象
	 */
	protected Implementor impl;
	/**
	 * 构造方法,传入实现部分的对象 
	 * @param impl 实现部分的对象
	 */
	public Abstraction(Implementor impl){
		this.impl = impl;
	}
	/**
	 * 示例操作,实现一定的功能,可能需要转调实现部分的具体实现方法
	 */
	public void operation() {
		impl.operationImpl();
	}
}

(3)该来看看具体的实现了,示例代码如下:

/**
 * 真正的具体实现对象
 */
public class ConcreteImplementorA implements Implementor {
	public void operationImpl() { 
		//真正的实现
	}
}
另外一个实现,示例代码如下:
/**
 * 真正的具体实现对象
 */
public class ConcreteImplementorB implements Implementor {
	public void operationImpl() { 
		//真正的实现
	}
}

(4)最后来看看扩展Abstraction接口的对象实现,示例代码如下:

/**
 * 扩充由Abstraction定义的接口功能
 */
public class RefinedAbstraction extends Abstraction {
	public RefinedAbstraction(Implementor impl) {
		super(impl);
	}
	/**
	 * 示例操作,实现一定的功能
	 */
	public void otherOperation(){
		//实现一定的功能,可能会使用具体实现部分的实现方法,
		//但是本方法更大的可能是使用Abstraction中定义的方法,
		//通过组合使用Abstraction中定义的方法来完成更多的功能
	}
}
(5)一个测试类:
public class Test{
	public static void main(String [] args){
		ConcreteImplementorA implA = new ConcreteImplementorA();
		ConcreteImplementorB implB = new ConcreteImplementorB();
		RefinedAbstraction client = new RefinedAbstraction(implA);
		client.operation();//调用implA方法
		client=new RefinedAbstraction(implB);
		client.operation();//调用implB方法
	}
}
实现了抽象和实现的完美分离。
原文地址:https://www.cnblogs.com/coser/p/2018345.html