1.模式动机
设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
- 第一种设计方案是为每一种形状都提供一套各种颜色的版本。
- 第二种设计方案是根据实际需要对形状和颜色进行组合
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。
2.模式定义
桥接模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
它是一种对象结构型模式。
桥接模式的优点是:
- 由于抽象与实现分离,所以扩展能力强;
- 其实现细节对客户透明。
缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
3.模式结构
桥接模式包含以下主要角色:
- 抽象类(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象类(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现类(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现类(Concrete Implementor)角色:给出实现化角色接口的具体实现。
4.模式代码
# 实现类角色
public interface IColor {
String name();
}
# 具体实现类角色
public class OrangeColor implements IColor {
@Override
public String name() {
return "Orange";
}
}
public class YellowColor implements IColor {
@Override
public String name() {
return "Yellow";
}
}
# 抽象类角色
public abstract class AbstractDrawShape {
protected IColor color;
public AbstractDrawShape(IColor color) {
this.color = color;
}
public abstract void draw();
}
# 扩展抽象类角色
public class DrawRoundShape extends AbstractDrawShape {
public DrawRoundShape(IColor color) {
super(color);
}
@Override
public void draw() {
System.out.println("颜色为 " + color.name() + " 的圆形");
}
}
public class DrawSquareShape extends AbstractDrawShape {
public DrawSquareShape(IColor color) {
super(color);
}
@Override
public void draw() {
System.out.println("颜色为 " + color.name() + " 的正方形");
}
}
5.总结
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
桥接模式的应用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
原文地址:https://www.cnblogs.com/wuqinglong/p/12335063.html
时间: 2024-10-26 20:30:59