将 类的功能层次结构 与 类的实现层次结构 分离的 Bridge模式

Bridge模式

应用场景

需要将类的功能层次结构类的实现层次结构连接起来,增加功能实例

本质

  • 分离抽象和实现

优点

  • 便于扩展

缺点

  • 暂无

角色

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

  • RefinedAbstraction (改善后的抽象化)
    在Abstraction角色的基础上增加了新功能的角色。在示例程序中CountDisplay类扮演此角色。

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

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

设计模式的类图

在这里插入图片描述

示例程序

示例程序的类图

在这里插入图片描述

示例代码

实现最顶层:

public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

具体实现类:

public class StringDisplayImpl extends DisplayImpl {
    private String string;                              // 要显示的字符串
    private int width;                                  // 以字节单位计算出的字符串的宽度
    public StringDisplayImpl(String string) {           // 构造函数接收要显示的字符串string
        this.string = string;                           // 将它保存在字段中
        this.width = string.getBytes().length;          // 把字符串的宽度也保存在字段中,以供使用。
    }
    public void rawOpen() {
        printLine();
    }
    public void rawPrint() {
        System.out.println("|" + string + "|");         // 前后加上"|"并显示
    }
    public void rawClose() {
        printLine();
    }
    private void printLine() {
        System.out.print("+");                          // 显示用来表示方框的角的"+"
        for (int i = 0; i < width; i++) {               // 显示width个"-"
            System.out.print("-");                      // 将其用作方框的边框
        }
        System.out.println("+");                        // 显示用来表示方框的角的"+"
    }
}

功能类顶层:

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();
    }
}

具体功能类:

public class CountDisplay extends Display {
    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }
    public void multiDisplay(int times) {       // 循环显示times次
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

测试类:

public class Main {
    public static void main(String[] args) {
        Display d1 = new Display(new StringDisplayImpl("Hello, China."));
        Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
        CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
        d1.display();
        d2.display();
        d3.display();
        d3.multiDisplay(5);
    }
}

拓展思路

  • 继承是强关联关系,委托是弱关联关系。
  • 面向对象最终要做到:松耦合、高内聚
  • 协议:横向
  • 接口:纵向

相关设计模式

  • Template Method模式
    在Template Method模式中使用了“类的实现层次结构”。父类调用抽象方法,而子类实现抽象方法。

  • Abstract Factory模式
    为了能够根据需求设计出良好的ConcreteImplementor角色,有时我们会使用Abstract Factory模式。

  • Adapter模式
    使用Bridge模式可以达到类的功能层次结构与类的实现层次结构分离的目的,并在此基础上使这些层次结构结合起来。

而使用Adapter模式则可以结合那些功能上相似但是接口( API )不同的类

满足的原则

  • 开放封闭原则
  • 里氏代换原则
  • 组合复用原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

莫余

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

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

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

打赏作者

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

抵扣说明:

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

余额充值