设计模式之桥接模式

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

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: 总结

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

相关推荐
Aileen_0v03 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
是小胡嘛3 小时前
数据结构之旅:红黑树如何驱动 Set 和 Map
数据结构·算法
yuanManGan5 小时前
数据结构漫游记:静态链表的实现(CPP)
数据结构·链表
2401_858286118 小时前
115.【C语言】数据结构之排序(希尔排序)
c语言·开发语言·数据结构·算法·排序算法
猫猫的小茶馆8 小时前
【数据结构】数据结构整体大纲
linux·数据结构·算法·ubuntu·嵌入式软件
2401_858286119 小时前
109.【C语言】数据结构之求二叉树的高度
c语言·开发语言·数据结构·算法
huapiaoy10 小时前
数据结构---Map&Set
数据结构
南宫生10 小时前
力扣-数据结构-1【算法学习day.72】
java·数据结构·学习·算法·leetcode
yuanbenshidiaos10 小时前
数据结构---------二叉树前序遍历中序遍历后序遍历
数据结构
^南波万^10 小时前
数据结构--排序
数据结构