Bridge桥接设计模式

本文介绍了Bridge桥接模式,其作用是连接类的功能层次结构和实现层次结构。功能层次结构用于增加新功能,实现层次结构用于实现接口。还给出示例程序,如Display类、CountDisplay类等,展示了两个层次结构的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bridge桥接模式

Bridge的意思是“桥梁”。桥梁的作用是将河流的两侧连接起来。

Bridge模式的作用也是将两样东西连接起来,分别是类的功能层次结构类的实现层次结构

类的层次结构的两个作用

  • 希望增加新功能时
    假设现有一个类something。当我们想在Something中增加新功能时(想增加一个具体方法时),
    会编写一个Something类的子类(派生类)。即SomethingGood类。这样就构成一个小小的类
    层次结构。
    Something
    |___SomethingGood
    这就是为了增加新功能而产生的层次结构。
    • 父类具有基本功能
    • 在子类中增加新的功能
      以上这种结构被称为“类的功能层次结构”。
  • 希望增加新的实现时
    抽象类声明了一些抽象方法,定义了接口(API),然后子类负责去实现这些抽象方法。父类的任务
    是通过声明抽象方法定义接口,而子类的任务是实现抽象方法。正是父类和子类的这种任务分担,
    才可以编写出具有高可替换性的类。
    其中也有存在层次结构。例如当子类ConcreteClass实现了父类AbstractClass类的抽象方法时,它们
    之间就构成了一个小小的层次结构。
    AbstractClass
    |___ConcreteClass
    但是,这里的类的层次结构并非用于增加功能,也就是说,这种层次结构并非用于方便我们增加新的
    方法。它的真正作用是帮助我们实现下面这样的任务分组。
    • 父类通过声明抽象方法来定义接口(API)
    • 子类通过实现具体方法来实现接口(API)
      这种层次结构被称为“类的实现层次结构”。

示例程序

在桥的哪一侧名字说明
类的功能层次结构Display负责“显示”的类
类的功能层次结构CountDisplay增加了“只显示规定次数”这一功能的类
类的实现层次结构DisplayImpl负责“显示”的类
类的实现层次结构StringDisplayImpl“用字符串显示”的类

Display类

package bridge;

/**
 * @author wenei
 * @date 2021-05-24 12:02
 */
public class Display {

    private DisplayImpl impl;

    public Display(DisplayImpl impl) {
        this.impl = impl;
    }

    public void open() {
        impl.rawOpen();
    }

    public void print() {
        impl.rawPrint();
    }

    public void close() {
        impl.rawClose();
    }

    public final void display() {
        open();
        print();
        close();
    }
}

Display类的功能是抽象的,负责“显示一些东西”。该类位于“类的功能层次结构”的最上层。

在impl字段中保存的是实现了Display类的具体功能的实例。

该实例通过Display类的构造函数被传递给Display类,然后保存在impl字段中,以供后面的
处理使用(impl字段即是类的两个层次结构的“桥梁”)。

CountDisplay类

package bridge;

/**
 * @author wenei
 * @date 2021-05-24 12:04
 */
public class CountDisplay extends Display {

    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }

    public void multiDisplay(int times) {
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

CountDisplay类在Display类的基础上增加了一个新功能。Display类只具有“显示”的功能,CountDisplay类
则具有“只显示规定的次数”的功能,这就是multiDisplay方法。

CountDisplay类继承了Display类的open、print、close方法,并使用它们来增加这个新功能。

这就是“类的功能层次结构”。

DisplayImpl类

package bridge;

/**
 * @author wenei
 * @date 2021-05-24 12:02
 */
public abstract class DisplayImpl {

    public abstract void rawOpen();

    public abstract void rawPrint();

    public abstract void rawClose();
}

DisplayImpl类位于“类的实现层次结构”的最上层。

DisplayImpl类是抽象类,它声明了rawOpen、rawPrint、rawClose这3个抽象方法,它们分别与
Display类的open、print、close方法相对应,进行显示前、显示、显示后处理。

StringDisplayImpl类

package bridge;

/**
 * @author wenei
 * @date 2021-05-24 12:05
 */
public class StringDisplayImpl extends DisplayImpl {

    private String string;

    private int width;

    public StringDisplayImpl(String string) {
        this.string = string;
        this.width = string.getBytes().length;
    }

    @Override
    public void rawOpen() {
        printLine();
    }

    @Override
    public void rawPrint() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void rawClose() {
        printLine();
    }

    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

StringDisplayImpl类是显示字符串的类。

不过,它不是直接的显示字符串,而是继承了DisplayImpl类,作为其子类来使用rawOpen、
rawPrint、rawClose方法进行显示。

DisplayImpl和StringDisplayImpl这两个类相当于“类的实现层次结构”。

Test类

package bridge;

/**
 * @author wenei
 * @date 2021-05-25 9:51
 */
public class Test {

    public static void main(String[] args) {
        Display display1 = new Display(new StringDisplayImpl("hello, China"));
        Display display2 = new Display(new StringDisplayImpl("hello, World"));

        CountDisplay countDisplay = new CountDisplay(new StringDisplayImpl("Hello, Universe"));
        display1.display();
        display2.display();
        countDisplay.display();
        countDisplay.multiDisplay(5);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥牛火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值