close
文章出處

學習橋接模式時,參考了云飛龍行的“研磨設計模式之橋接模式”一文,感覺作者講得很好,清晰易懂。

該文地址: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方法
	}
}
實現了抽象和實現的完美分離。

不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()