桥梁模式的定义:抽象的部分和他的实现部分分离,是他们都可以独立的变化。
一般一个抽象有多个实现时我们一般通过继承来协调他们,通过定义抽象的接口用子类来实现,这样方法有时不太灵活,很难使抽象部分和实现部分单独修改。
此时我们通过桥梁模式将他们拆分开来,就能很好的解决这个问题。
桥梁模式使用的是一个组合的关系。
桥梁模式有四个元素
抽象角色:它定义了一个接口而且拥有一个指向实现接口角色的一个引用;
具体抽象角色:实现并扩充抽象角色定义的接口;
实现角色:给出了实现类的接口,这里的接口可以与抽象角色中的接口不一致;
具体实现角色:实现了实现类接口的具体实现;
首先我们来看一下实例
抽象角色:
/** * */ package com.model.bridge; /** *************************************************************** * 项目名称:DescignModel * 程序名称:Abstract * 日期:2012-8-9 下午01:51:13 * 作者: * 模块: * 描述: * 备注: * ------------------------------------------------------------ * 修改历史 * 序号 日期 修改人 修改原因 * * 修改备注: * @version *************************************************************** */ public abstract class Abstract { /** *实现角色引用 * * */ private Implement implement; public void setImplement(Implement implement) { this.implement = implement; } public Implement getImplement() { return implement; } /** * * 方法名:method * 描述:定义抽象类的接口 * 作者: * 日期:2012-8-9 下午02:23:28 * @param * @return void */ public abstract void method(); }具体抽象角色:
/** * */ package com.model.bridge; /** *************************************************************** * 项目名称:DescignModel * 程序名称:RefinedAbstract * 日期:2012-8-9 下午02:24:59 * 作者:白鹏飞 * 模块: * 描述: * 备注: * ------------------------------------------------------------ * 修改历史 * 序号 日期 修改人 修改原因 * * 修改备注: * @version *************************************************************** */ public class RefinedAbstract extends Abstract { /** * 实现组合 */ @Override public void method() { //实现抽象角色方法 System.out.println("This is RefinedAbstract"); //组合实现接口功能 getImplement().doIt(); } }实现角色:
/** * */ package com.model.bridge; /** *************************************************************** * 项目名称:DescignModel * 程序名称:Implement * 日期:2012-8-9 下午01:53:50 * 作者: * 模块: * 描述: * 备注: * ------------------------------------------------------------ * 修改历史 * 序号 日期 修改人 修改原因 * * 修改备注: * @version *************************************************************** */ public interface Implement { /** * * 方法名:doIt * 描述:定义一些接口 * 作者: * 日期:2012-8-9 下午03:45:38 * @param * @return void */ public void doIt(); }具体实现角色:
/** * */ package com.model.bridge; /** *************************************************************** * 项目名称:DescignModel * 程序名称:ConcreteImplement * 日期:2012-8-9 下午02:27:19 * 作者: * 模块: * 描述: * 备注: * ------------------------------------------------------------ * 修改历史 * 序号 日期 修改人 修改原因 * * 修改备注: * @version *************************************************************** */ public class ConcreteImplement implements Implement { /* (non-Javadoc) * @see com.model.bridge.Implement#doIt() */ @Override public void doIt() { System.out.println("This is ConcreteImplement"); } }
/** * */ package com.model.bridge; /** *************************************************************** * 项目名称:DescignModel * 程序名称:Client * 日期:2012-8-9 下午02:29:15 * 作者: * 模块: * 描述: * 备注: * ------------------------------------------------------------ * 修改历史 * 序号 日期 修改人 修改原因 * * 修改备注: * @version *************************************************************** */ public class Client { /** * 方法名:main * 描述: * 作者: * 日期:2012-8-9 下午02:29:15 * @param @param args * @return void */ public static void main(String[] args) { Implement implement = new ConcreteImplement(); Abstract abstr = new RefinedAbstract(); abstr.setImplement(implement); abstr.method(); } }
就是不仅仅可以实现功能还可以通过组合去完成新的功能。
并且我们在扩充和修改接口时缩小影响范围。
桥梁模式是一个非常强大的模式,仅仅看一看demo是无法充分利用和明白优势所在,还必须不断的实践。