设计模式之桥接模式

哈喽,今天我们来看下桥接模式,顾名思义,就是一座'桥',将不同维度的内容进行链接。我们来看下具体是什么意思吧。

1: 简介

定义: 将抽象部分与它的实现部分分离,使他们都可以独立地变化。看下UML结构图:

其中Abstraction为抽象化角色,定义出该角色的行为,同时保存一个对实例化角色的引用。implementor 是实例化角色,它是接口或者抽象类,定义角色必须的行为和属性。RefinedAbstraction 为修正抽象化角色,引用实例化角色对抽象化角色进行修改。ConcreteImplementor,为具体实现化角色,实现接口或抽象类定义的方法或者属性。这段是不是听着很懵,哈哈哈,没错,我也看着很懵。

下面我们举个栗子。

2: 实例代码

有个需求,点奶茶,奶茶容量分为大,小杯,奶茶中添加的牛奶,水果。怎么实现呢。有人说,我创建两个奶茶容量类,再创建两个奶茶放料的两个类,分别去处理这些,也可以实现功能,但是如果奶茶容量还有超大杯,中杯,等等,添加类让你怀疑人生。我看行通过桥接模式是怎么实现的。

java 复制代码
public abstract class MilkyTea {


    protected IMilkyTeaAdditives additives;

    public MilkyTea(IMilkyTeaAdditives additives) {
        this.additives = additives;
    }

    /**
     * 点奶茶
     * @param count
     */
     public abstract void orderMilktyTea(int count);
}

public abstract class RefinedMilkyTea extends MilkyTea {

    public RefinedMilkyTea(IMilkyTeaAdditives additives) {
        super(additives);
    }

}



//定义大杯奶茶
public class LargeMilkyTea extends RefinedMilkyTea {

    public LargeMilkyTea(IMilkyTeaAdditives additives) {
        super(additives);
    }

    @Override
    public void orderMilktyTea(int count) {
        additives.addsomething();
        System.out.println(String.format("大杯奶茶%d杯",count));
    }
}

public class SmallMilkyTea extends RefinedMilkyTea {

    public SmallMilkyTea(IMilkyTeaAdditives additives) {
        super(additives);
    }

    @Override
    public void orderMilktyTea(int count) {
        additives.addsomething();
        System.out.println(String.format("小杯奶茶%d杯",count));
    }
}

public interface IMilkyTeaAdditives {
    void addsomething();
}



public class Milk implements IMilkyTeaAdditives {

    @Override
    public void addsomething() {
        System.out.println("加奶");
    }
}

public class Fruit implements IMilkyTeaAdditives {
    @Override
    public void addsomething() {
        System.out.println("加水果");
    }
}

//测试
public class TestMain {
    public static void main(String[] args) {
        LargeMilkyTea largeCoffee = new LargeMilkyTea(new Milk());
        largeCoffee.orderMilktyTea(10); // 加奶 大杯奶茶10杯
        SmallMilkyTea smallMilkyTea = new SmallMilkyTea(new Fruit());
        smallMilkyTea.orderMilktyTea(5); //加水果 小杯奶茶5杯
    }
}

看完这个代码 是不是清晰了很多。

3: 使用场景
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
4: 优缺点

优点:

  • 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
  • 实现细节对客户透明,可以对用户隐藏实现细节

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性
5: 总结

桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。对于两个独立变化的维度,使用桥接模式再适合不过了。

相关推荐
郝学胜-神的一滴11 分钟前
深度解析:Python元类手撸ORM框架,解锁底层编程魔法
数据结构·数据库·python·算法·职场和发展
big_rabbit050217 分钟前
[算法][力扣219]存在重复元素2
数据结构·算法·leetcode
仟濹44 分钟前
【算法打卡day20(2026-03-12 周四)算法/技巧:哈希表,双指针,字符串交换处理】5个题
数据结构·算法·散列表
样例过了就是过了1 小时前
LeetCode热题100 子集
数据结构·c++·算法·leetcode·dfs
一叶落4382 小时前
【LeetCode 172】阶乘后的零(C语言详解 | 数学规律 + 对数时间复杂度)
c语言·数据结构·算法·leetcode·动态规划
自信150413057592 小时前
数据结构初阶——二叉树之——堆的实现
c语言·数据结构·算法
Barkamin2 小时前
(有头)链表的实现(Java)
java·数据结构·链表
!停2 小时前
数据结构算法—归并排序
数据结构·算法
亓才孓3 小时前
【Stream】讲常见数据结构转为map<String,Long>
数据结构·windows·python
JamesYoung79713 小时前
第七部分 — 存储 数据建模与迁移提示
java·开发语言·数据结构