设计模式之桥接模式

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

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

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

相关推荐
Hera_Yc.H6 小时前
数据结构之一:复杂度
数据结构
肥猪猪爸7 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
linux_carlos7 小时前
环形缓冲区
数据结构
readmancynn7 小时前
二分基本实现
数据结构·算法
Bucai_不才7 小时前
【数据结构】树——链式存储二叉树的基础
数据结构·二叉树
盼海8 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步8 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
珹洺9 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
几窗花鸢9 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn9 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论