类似于多继承方案,但是Java没有多继承,桥接模式是比多继承更好的替代方案
核心:解耦抽象和实现
抽象角色:该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现
修正抽象角色:抽象角色的具体实现,对它的方法进行完善和扩展
实现角色:定义实现维度的基本操作,提供给抽象角色使用
具体实现角色:实现角色的具体实现
1、提供糖和咖啡
package com.xjion.bridge; /** * 咖啡中的糖分 */ public interface CoffeeFlavor { String addWhat(); } package com.xjion.bridge; /** * 咖啡 */ public abstract class Coffee { CoffeeFlavor flavor; public Coffee(CoffeeFlavor flavor) { this.flavor = flavor; } public abstract void makeCoffee(); }2、咖啡糖分选择
package com.xjion.bridge; /** * 原味 */ public class PlainFlavor implements CoffeeFlavor { @Override public String addWhat() { return "原味拿铁"; } } /** * 加糖 */ class SugarFlavor implements CoffeeFlavor{ @Override public String addWhat() { return "加糖摩卡"; } }3、选择大杯或者小杯咖啡
package com.xjion.bridge; /** * 大杯咖啡 */ public class LargeCoffee extends Coffee { public LargeCoffee(CoffeeFlavor flavor) { super(flavor); } @Override public void makeCoffee() { System.out.println("大杯咖啡:"+flavor.addWhat()); } } class SmallCoffee extends Coffee{ public SmallCoffee(CoffeeFlavor flavor) { super(flavor); } @Override public void makeCoffee() { System.out.println("小杯咖啡:"+flavor.addWhat()); } }4、客户端使用
package com.xjion.bridge; public class Test { public static void main(String[] args) { //原味 CoffeeFlavor flavor = new PlainFlavor(); //大杯原味咖啡 Coffee coffee = new LargeCoffee(flavor); //制作 coffee.makeCoffee(); //制作一杯小杯的加糖的咖啡 new SmallCoffee(new SugarFlavor()).makeCoffee(); } }采用桥接模式解耦了咖啡的大小杯和有无糖这两个独立变化的维度,后续如果咖啡馆有更多服务,那么可以直接新建一个中杯类继承coffee即可,味道改变只需要新建一个类实现CoffeeFlavor即可。
抽象与实现分离,避免使用继承,解耦了抽象与实现,使系统扩展性大大增强
优秀的扩展能力,实现细节对客户透明,通过聚合构建了稳定的架构(封装)
