桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
这句话现在看还是很抽象,我们先看一个例子。
我们有两种咖啡、拿铁和美式。
对于咖啡,我们提供两种可添加的选项,分别是加奶和加糖。
这样我们就有了四种选项,拿铁加奶、拿铁加糖、美式加奶、美式加糖
假如说我们不用设计模式会怎么样呢
未使用设计模式
/** * 咖啡接口:可以加奶加糖 */ public interface Coffee { void add(); }
public class MCoffeeSugar implements Coffee { @Override public void add() { System.out.println("美式加糖"); } } class MCoffeeMilk implements Coffee { @Override public void add() { System.out.println("美式加奶"); } } class latteCoffeeSugar implements Coffee { @Override public void add() { System.out.println("拿铁加糖"); } } class latteCoffeeMilk implements Coffee { @Override public void add() { System.out.println("拿铁加奶"); } }
public static void main(String[] args) { /** * 结果为: * 美式加奶 * 美式加糖 * 拿铁加糖 * 拿铁加奶 */ MCoffeeMilk mCoffeeMilk = new MCoffeeMilk(); mCoffeeMilk.add(); MCoffeeSugar mCoffeeSugar = new MCoffeeSugar(); mCoffeeSugar.add(); latteCoffeeSugar latteCoffeeSugar = new latteCoffeeSugar(); latteCoffeeSugar.add(); latteCoffeeMilk latteCoffeeMilk = new latteCoffeeMilk(); latteCoffeeMilk.add(); }
这里就是一个2*2的组合,一旦是3*3、4*4 那么我们的类将几何倍的增加。
使用桥接模式
public class Milk implements CoffeeAdd{ @Override public String add() { return "加奶"; } }
public class Sugar implements CoffeeAdd{ @Override public String add() { return "加糖"; } }
public interface CoffeeAdd { String add(); }
public abstract class Coffee { private CoffeeAdd coffeeAdd; Coffee(CoffeeAdd coffeeAdd) { this.coffeeAdd = coffeeAdd; } public abstract void show(); public CoffeeAdd getCoffeeAdd() { return coffeeAdd; } public void setCoffeeAdd(CoffeeAdd coffeeAdd) { this.coffeeAdd = coffeeAdd; } }
public class latteCoffee extends Coffee{ latteCoffee(CoffeeAdd coffeeAdd) { super(coffeeAdd); } @Override public void show() { System.out.println("拿铁咖啡"+super.getCoffeeAdd().add()); } }
public class MCoffee extends Coffee{ MCoffee(CoffeeAdd coffeeAdd) { super(coffeeAdd); } @Override public void show() { System.out.println("美式咖啡"+super.getCoffeeAdd().add()); } }
public class Client { public static void main(String[] args) { Milk milk = new Milk(); Sugar sugar = new Sugar(); /** * 结果为: * 美式咖啡加奶 * 美式咖啡加糖 * 拿铁咖啡加奶 * 拿铁咖啡加糖 */ new MCoffee(milk).show(); new MCoffee(sugar).show(); new latteCoffee(milk).show(); new latteCoffee(sugar).show(); } }
我们把咖啡的种类作为抽象部分,把加糖加奶作为实现部分,在这两个维度中,无论谁发生了变化,都可以自由进行组合。
源码体现
可以参考该博客
120271538.pc_agg_new_rank&utm_term=%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F%E5%9C%A8%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8&spm=1000.2123.3001.4430