# 桥接模式(Bridge Pattern)
代码地址
- Github:DesignPattern/src/main/java/com/design/bridge (opens new window)
- Gitee(码云):DesignPattern/src/main/java/com/design/bridge (opens new window)
# 1. 介绍
桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化,通过组合的方式建立两个类之间的关系,而不是通过继承。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响
# 1.1. 特点
待补充
# 1.2. 结构
待补充
# 1.3. 优缺点
- 意图:将抽象部分与实现部分分离,使它们都可以独立的变化
- 主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活
- 何时使用:实现系统可能有多个角度分类,每一种角度都可能变化
- 如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合
- 关键代码:抽象类依赖实现类
- 使用场景:
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
- 优点:
- 抽象和实现的分离
- 优秀的扩展能力
- 实现细节对客户透明
- 符合开闭原则和合成复用原则
- 缺点
- 增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
- 注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了
# 2. 代码
使用一个画不同颜色的形状的小例子说明
/**
* 桥接模式 - 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活
* 使用一个画不同颜色的形状的小例子说明,比如可以画正方形、长方形、圆形
* 但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色
* 这里我们可以画出 3 * 3 = 9 种图形,一般直接的做法是使用继承,
* 为每种形状都提供各种颜色的版本,这样的做法不灵活,
* 会导致实现类几何增长,所以引出了桥接模式,根据实际需要对颜色和形状进行组合
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class Main {
public static void main(String[] args) {
// 颜色
Color whiteColor = new WhiteColorImpl();
Color blackColor = new BlackColorImpl();
Color grayColor = new GrayColorImpl();
// 形状
Shape square = new SquareShapeImpl();
Shape rectangleShape = new RectangleShapeImpl();
Shape circleShape = new CircleShapeImpl();
// 白色的正方形
square.setColor(whiteColor);
square.draw();
// 灰色的正方形
square.setColor(grayColor);
square.draw();
// 黑色的长方形
rectangleShape.setColor(blackColor);
rectangleShape.draw();
// 灰色的圆形
circleShape.setColor(grayColor);
circleShape.draw();
// 白色的圆形
circleShape.setColor(whiteColor);
circleShape.draw();
}
}
白色的正方形
灰色的正方形
黑色的长方形
灰色的圆形
白色的圆形
# 2.1. 颜色
/**
* 颜色接口
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public interface Color {
void bepaint(String shape);
}
/**
* 白色
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class WhiteColorImpl implements Color {
@Override
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
/**
* 黑色
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class BlackColorImpl implements Color {
@Override
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
/**
* 灰色
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class GrayColorImpl implements Color {
@Override
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
# 2.2. 形状
/**
* 形状抽象类
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public abstract class Shape {
protected Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
/**
* 圆形
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class CircleShapeImpl extends Shape {
@Override
public void draw() {
color.bepaint("圆形");
}
}
/**
* 正方形
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class SquareShapeImpl extends Shape {
@Override
public void draw() {
color.bepaint("正方形");
}
}
/**
* 长方形
*
* @author wliduo[i@dolyw.com]
* @date 2023/2/2 17:05
*/
public class RectangleShapeImpl extends Shape {
@Override
public void draw() {
color.bepaint("长方形");
}
}