概述
类似于多继承方案,但是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即可。
特点
抽象与实现分离,避免使用继承,解耦了抽象与实现,使系统扩展性大大增强
优秀的扩展能力,实现细节对客户透明,通过聚合构建了稳定的架构(封装)