8-桥接模式

桥接模式

参考:桥接模式 | 菜鸟教程 (runoob.com)

image-20221107195453733

桥接模式的定义

将两个独立的维度分离,然后在两者的抽象层进行关联。

image-20221130195047696

对象结构型模式

  • 又被称为柄体(Handle and Body)模式接口(Interface)模式
  • 抽象关联取代了传统的多层继承
  • 将类之间的静态继承关系转换为动态的对象组合关系

一般将可能会被重用的部分作为实现部分,而将某些固有的特性作为抽象部分

桥接模式结构

image-20221130200416474

两个继承部分:

  1. 抽象部分的继承结构
    • Abstraction类不做成interface,因为Abstraction类会涉及到对象注入的set方法
  2. 实现部分的继承结构
桥接模式包含以下4个角色:
  1. Abstraction(抽象类)

  2. RefinedAbstraction(扩充抽象类)

  3. Implementor(实现类接口)

  4. ConcreteImplementor(具体实现类)

典型的实现类接口代码
1
2
3
public interface Implementor {
public void operationImpl();
}
典型的具体实现类代码
1
2
3
4
5
public class ConcreteImplementor implements Implementor {
public void operationImpl() {
//具体业务方法的实现
}
}
典型的抽象类代码
1
2
3
4
5
6
7
8
9
public abstract class Abstraction {
protected Implementor impl; //定义实现类接口对象

public void setImpl(Implementor impl) {
this.impl=impl;
}

public abstract void operation(); //声明抽象业务方法
}
典型的扩充抽象类(细化抽象类)代码
1
2
3
4
5
6
7
public class RefinedAbstraction extends Abstraction {
public void operation() {
//业务代码
impl.operationImpl(); //调用实现类的方法,impl为父类的保护对象,子类可见的同时不破坏封装性
//业务代码
}
}
桥接模式实现
image-20221130200622245
实例类图:
image-20221130202031398 image-20221130202039729

imp:ImageImp对象设为保护类型(包内可见),确保子类能够调用的同时,类外不能访问调用,保证了封装性!

(1) Matrix:像素矩阵类,辅助类

(2) ImageImp:抽象操作系统实现类,充当实现类接口

(3) WindowsImp:Windows操作系统实现类,充当具体实现类

(4) LinuxImp:Linux操作系统实现类,充当具体实现类

(5) UnixImp:UNIX操作系统实现类,充当具体实现类

(6) Image:抽象图像类,充当抽象类

(7) JPGImage:JPG格式图像类,充当扩充抽象类

(8) PNGImage:PNG格式图像类,充当扩充抽象类

(9) BMPImage:BMP格式图像类,充当扩充抽象类

(10) GIFImage:GIF格式图像类,充当扩充抽象类

(11) Client:客户端测试类

配置文件优化

如果需要更换图像文件格式或者更换操作系统,只需修改配置文件即可

1
2
3
4
5
6
7
<?xml version="1.0"?>
<config>
<!--RefinedAbstraction-->
<className>designpatterns.bridge.JPGImage</className>
<!--ConcreteImplementor-->
<className>designpatterns.bridge.WindowsImp</className>
</config>

⭐️模式连用

  • 桥接模式:用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化

  • 适配器模式:当发现系统与已有类无法协同工作时

image-20221130203657692

桥接模式与适配器模式联用示意图

模式优点

  • 分离抽象接口及其实现部分

  • 可以取代多层继承方案,极大地**减少了子类的个数**

  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

模式缺点

  • 增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程

  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情

模式适用环境

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系

  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响

  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展

  • 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统

课后思考

如果系统中存在两个以上的变化维度,是否可以使用桥接模式进行处理?如果可以,系统该如何设计?

可以使用,可以将一个维度作为抽象部分,两个维度做成实现部分。

image-20221205191140659

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2024 Guijie Wang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信