本文共 3637 字,大约阅读时间需要 12 分钟。
桥接模式(Bridge),将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。最大特点就是聚合关系在桥梁里面,具体的业务逻辑由子类完成。
1、Implementor类
public abstract class Implementor { public abstract void operation();}
2、Implementor具体实现类
public class ConcreteImplementorA extends Implementor { @Override public void operation() { System.out.println("实现A的方法执行!"); }}public class ConcreteImplementorB extends Implementor { @Override public void operation() { System.out.println("实现B的方法执行!"); }}
3、Abstraction桥梁类
public abstract class Abstration { protected Implementor implementor; public Implementor getImplementor() { return implementor; } public void setImplementor(Implementor implementor) { this.implementor = implementor; } public abstract void operation();}
4、RefinedAbstraction类
public class RefinedAbstration extends Abstration { @Override public void operation(){ implementor.operation(); }}
5、测试类
public class Test { public static void main(String[] args) { Abstration abstration = new RefinedAbstration(); abstration.setImplementor(new ConcreteImplementorA()); abstration.operation(); abstration.setImplementor(new ConcreteImplementorB()); abstration.operation(); }}输出:实现A的方法执行!实现B的方法执行!
比如我们在饮品点买饮品,除开要买什么饮品,还有大杯、中杯、小杯,加冰和不加冰,那么我们用代码来实现一下.
建立抽象部分:这里将饮品定位抽象,持有杯抽象和加冰抽象/** * 先定义抽象的饮品,这里指代饮品类型 */public abstract class AbsBriageAction { /** * 持有杯大小引用 */ private ICup iCup; /** * 持有加冰不加冰引用 */ private IIce iIce; /** * 具体的饮品由子类去实现 */ abstract void makeDrinks(); public void setiCup(ICup iCup) { this.iCup = iCup; } public void setiIce(IIce iIce) { this.iIce = iIce; } protected String getiCup() { return this.iCup.getCup(); } protected String getiIce() { return iIce.getIce(); }}/** * 饮品的大小杯抽象 */public interface ICup { /** * 获取大杯还是小杯 * * @return 大杯或小杯 */ String getCup();}/** * 饮品加冰或不加冰抽象 */public interface IIce { /** * 加冰和不加冰 * * @return 加冰或不加冰 */ String getIce();}
实现大小杯和加冰不加冰:继承杯抽象和加不加冰抽象
/** * 大杯 */public class BigCup implements ICup { @Override public String getCup() { return "大杯"; }}/** * 小杯 */public class SmallCup implements ICup { @Override public String getCup() { return "小杯"; }}/** * 加冰 */public class AddIce implements IIce { @Override public String getIce() { return "加冰"; }}/** * 不加冰 */public class NoIce implements IIce { @Override public String getIce() { return "不加冰"; }}
在看看具体抽象:这里用橙汁和百香果汁
/** * 橙汁 */public class OringeDrinks extends AbsBriageAction { @Override void makeDrinks() { System.out.println("橙汁" + getiCup() + getiIce()); }}/** * 百香果饮品 */public class PassionFruitDrinks extends AbsBriageAction { @Override void makeDrinks() { System.out.println("百香果" + getiCup() + getiIce()); }}
测试类:
public static void main(String[] args) { //橙汁大杯加糖 AbsBriageAction absBriageAction = new OringeDrinks(); ICup bigCup = new BigCup(); IIce addIce = new AddIce(); absBriageAction.setiCup(bigCup); absBriageAction.setiIce(addIce); absBriageAction.makeDrinks(); //百香果小杯不加糖 AbsBriageAction passionFruit = new PassionFruitDrinks(); ICup smallCup = new SmallCup(); IIce noIce = new NoIce(); passionFruit.setiCup(smallCup); passionFruit.setiIce(noIce); passionFruit.makeDrinks(); }输出:橙汁大杯加冰百香果小杯不加冰类似UML中的,通过
饮品抽象中的持有大小杯与加冰抽象,在抽象层建立联系,使得他们三者都可以独立进行变化。
注:参考文献《大话设计模式》程杰著。