Bridge模式


title: Bridge模式
tag: 笔记 设计模式

image-20231026221545810

Bridge模式

该模式的作用正如同它的名字“桥梁”的作用,它是用于连接一个类的下面两种东西:

  • 类的功能层次结构

当我们希望为类扩展新的功能时会使用继承的手法来扩展功能,父类具有基本功能,子类增加新的功能。这样就会构成类层次结构。

  • 类的实现层次结构

在接口或者抽象类中我们会定义一些抽象方法,然后交由子类进行具体实现。这些抽象方法的作用并不是用于扩展功能而是实现功能

这样就构成了实现层次结构。

而我们的Bridge模式的作用就是将类的功能层次结构和类的实现层次结构分离为两个独立的类层次结构,并搭建“桥梁”将它们连接起来。

介绍

**意图:**将抽象部分与实现部分分离,使它们都可以独立的变化。

**主要解决:**在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

**何时使用:**实现系统可能有多个角度分类,每一种角度都可能变化。

**如何解决:**把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

**关键代码:**抽象类依赖实现类。

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

**缺点:**桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

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

示例程序

该程序的作用是显示一些东西。

UML图:

image-20231026214648284
  • Display抽象层次和实现层次连接的桥梁,基本作用是显示一段字符串(通过委托DisplayImpl实现)。
  • DisplayImpl实现层次的接口,被Display使用,定义实现层的抽象方法。
  • StringDisplayImpl实现层次的具体实现
  • CountDisplay:对Display的扩展,Display的功能层次。

Display类

public class Display {
    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();
    }
}

这里我们通过委托的方式连接了类的实现层次(DisplayImpl接口);

DisplayImpl接口

public interface DisplayImpl {
    void rawOpen();

    void rawPrint();

    void rawClose();
}

Display的实现层次接口。

StringDisplayImpl类

public class StringDisplayImpl implements DisplayImpl{
    private String s;
    private int width;
    public StringDisplayImpl(String s){
        this.s = s;
        this.width = s.length();
    }

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

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

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

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

Display的具体实现层次,打印并加上边框输出传入的字符串。

CountDisplay类

public class CountDisplay extends Display{

    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }
    public void multiDisplay(int n){
        open();
        for (int i = 0; i < n; i++) {
            print();
        }
        close();
    }
}

继承Display并扩展新功能(多次输出),属于Display的功能层次。

测试

public static void main(String[] args) {
    Display display = new Display(new StringDisplayImpl("Hello World!"));
    display.display();
    CountDisplay countDisplay = new CountDisplay(new StringDisplayImpl("Hello World!"));
    countDisplay.multiDisplay(5);
}

输出:

+------------+
|Hello World!|
+------------+
+------------+
|Hello World!|
|Hello World!|
|Hello World!|
|Hello World!|
|Hello World!|
+------------+

Bridge模式的角色

  • Abstraction(抽象化)

该角色位于“类的功能层次结构”的最上层。它使用Implementor角色的方法定义了基本的功能。该角色中保存了Implementor角色的实例。在示例程序中,由Display类扮演此角色。

  • RefinedAbstraction(改善后的抽象化)

Abstraction角色的基础上增加了新功能的角色。在示例程序中,由CountDisplay类扮演此角色。

  • Implementor(实现者)

该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction角色的接口(API)的方法。在示例程序中,由DisplayImpl类扮演此角色。

  • Concretelmplementor(具体实现者)

该角色负责实现在Implementor角色中定义的接口(API)。在示例程序中,由StringDisplayImpl类扮演此角色。

  • Implementor(实现者)

该角色位于“类的实现层次结构”的最上层。它定义了用于实现Abstraction角色的接口(API)的方法。在示例程序中,由DisplayImpl类扮演此角色。

  • Concretelmplementor(具体实现者)

该角色负责实现在Implementor角色中定义的接口(API)。在示例程序中,由StringDisplayImpl类扮演此角色。

image-20231026221411155
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值