博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
文章目录
- 1、什么是桥接模式
- 2、桥接模式的优缺点
- 3、桥接模式的应用场景
- 4、桥接模式的结构
- 5、桥接模式的代码案例
1、什么是桥接模式
桥接模式(Bridge Pattern)是一种软件设计模式,它允许将一个大类或一组紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能够在两个层次结构之间独立地进行变化。这种模式的主要目的是将抽象部分与实现部分分离,使它们可以独立地进行修改、扩展和重用。通过桥接模式,可以更加灵活地组合和扩展不同的抽象和实现,从而实现更高层次的抽象和更复杂的功能。
2、桥接模式的优缺点
桥接模式的优点包括:
-
分离抽象和实现,使得两者可以独立地变化,提高系统的灵活性和可扩展性。
-
可以减少子类的数量,简化系统的设计和实现。
-
可以更好地控制系统的复杂度,避免出现类爆炸的情况。
-
可以提高系统的可维护性和可测试性,降低维护和测试的成本。
桥接模式的缺点包括:
-
增加了系统的复杂度,需要额外的编码工作。
-
对系统的性能有一定的影响,因为需要通过抽象层和实现层之间的桥接来传递信息。
-
如果设计不合理,可能会导致系统的层次结构过于复杂,难以理解和维护。
3、桥接模式的应用场景
桥接模式主要适用于以下场景:
-
当一个类存在多个独立变化的维度时,可以使用桥接模式将这些维度分离出来,使得它们可以独立地变化,从而减少类的数量。
-
当需要在抽象和实现之间增加一个中间层时,可以使用桥接模式来实现。例如,当需要在不同平台上使用相同的代码时,可以将平台相关的代码放在实现层,将平台无关的代码放在抽象层,通过桥接来实现它们之间的通信。
-
当需要动态地切换抽象和实现的关系时,可以使用桥接模式来实现。例如,当需要在运行时切换不同的数据库时,可以将数据库相关的代码放在实现层,将业务逻辑相关的代码放在抽象层,通过桥接来实现它们之间的通信。
-
当需要对一个类进行扩展时,可以使用桥接模式来实现。例如,当需要对一个手机应用程序进行扩展,可以将应用程序的功能和界面分别放在抽象层和实现层,通过桥接来实现它们之间的通信,从而实现更加灵活的扩展。
4、桥接模式的结构
下面是桥接模式的结构:
-
抽象部分(Abstraction):定义抽象类,并包含一个指向实现部分的引用,它的主要职责是定义出高层次的抽象接口,实现部分的具体实现交给其实现部分处理。
-
扩展抽象部分(Refined Abstraction):扩展抽象部分的接口,通常需要根据具体业务需求进行扩展。
-
实现部分(Implementor):定义实现部分的接口,它不关心抽象部分的接口,只负责实现自己的业务逻辑。
-
具体实现部分(Concrete Implementor):具体实现实现部分的接口,通过实现接口来完成具体的业务逻辑。
桥接模式的结构中,抽象部分和实现部分是通过一个指向实现部分的引用进行关联的。这个引用可以在运行时进行动态绑定,从而实现不同的抽象和实现的组合。
5、桥接模式的代码案例
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 接口
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:19
*/
interface Color {
void applyColor();
}
接口的实现
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 红色
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:20
*/
class RedColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying red color");
}
}
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 绿色
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:20
*/
class GreenColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying green color");
}
}
抽象类
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 抽象类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:20
*/
public abstract class Shape {
protected Color color;
public Shape(Color color) {
this.color = color;
}
abstract void draw();
}
扩展抽象类
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 扩展抽象类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:21
*/
class Square extends Shape {
public Square(Color color) {
super(color);
}
@Override
void draw() {
System.out.print("Drawing a square, ");
color.applyColor();
}
}
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 扩展抽象类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:21
*/
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
void draw() {
System.out.print("Drawing a circle, ");
color.applyColor();
}
}
客户端程序:
package com.pany.camp.design.principle.bridges;
/**
*
* @description: 客户端
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 20:22
*/
public class Client {
public static void main(String[] args) {
Color red = new RedColor();
Color green = new GreenColor();
Shape square = new Square(red);
square.draw();
Shape circle = new Circle(green);
circle.draw();
}
}
Color 是实现部分,Shape 是抽象部分,Square 和 Circle 是扩展抽象部分,RedColor 和 GreenColor 是具体实现部分。我们通过将颜色实现和形状抽象分离出来,可以实现不同形状和颜色的组合,从而提高系统的灵活性和可扩展性。
输出结果如下:
Drawing a square, Applying red color
Drawing a circle, Applying green color
Process finished with exit code 0
💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊