學習橋接模式時,參考了云飛龍行的“研磨設計模式之橋接模式”一文,感覺作者講得很好,清晰易懂。
該文地址:http://www.cnblogs.com/sjms/archive/2010/09/01/1814718.html
橋接模式:
定義:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。所謂橋接,通俗點說就是在不同的東西之間搭一個橋,讓他們能夠連接起來,可以相互通訊和使用。那么在橋接模式中到底是給什么東西來搭橋呢?就是為被分離了的抽象部分和實現部分來搭橋。在橋接模式中的橋接是單向的,也就是只能是抽象部分的對象去使用具體實現部分的對象,而不能反過來,也就是個單向橋。
模式結構和說明:
說明:
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 |