桥接模式

mac2026-06-15  15

概述

类似于多继承方案,但是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即可。

特点

抽象与实现分离,避免使用继承,解耦了抽象与实现,使系统扩展性大大增强

优秀的扩展能力,实现细节对客户透明,通过聚合构建了稳定的架构(封装)

 

 

最新回复(0)