桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。
前言
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。它通过提供一个桥接结构,将抽象部分与实现部分解耦,这样两者的变化不会相互影响,从而应对多层继承结构带来的问题。假设你正在设计一个游戏,游戏中有不同类型的角色和武器。如果不使用桥接模式,你可能会为每种角色和武器的组合创建一个子类,这样会导致大量的子类产生。但是,如果使用桥接模式,你可以将角色和武器分离开来,使得它们可以独立地进行扩展。你可以创建一个角色接口和一个武器接口,然后让每个具体的角色类和武器类实现这些接口。这样,你就可以在运行时动态地组合不同的角色和武器,而不需要创建大量的子类。
一、桥接模式的核心角色
- 抽象化(Abstraction):它是用于定义抽象的基本操作的接口或抽象类。
- 修正/细化(RefinedAbstraction):它是扩展了抽象化角色的抽象,与实现化角色一起使用。
- 实现化(Implementor):它是定义实现部分接口的接口或抽象类。
- 具体实现化(ConcreteImplementor):它是实现化角色接口的具体实现。
二、具体实现
1实现化接口
代码如下(示例):
// 实现化接口
interface Implementor {
void operationImpl();
}
2.具体实现化类
代码如下(示例):
// 具体实现化类A
class ConcreteImplementorA implements Implementor {
public void operationImpl() {
System.out.println("ConcreteImplementorA operation");
}
}
// 具体实现化类B
class ConcreteImplementorB implements Implementor {
public void operationImpl() {
System.out.println("ConcreteImplementorB operation");
}
}
3.抽象化接口
代码如下(示例):
// 抽象化接口
interface Abstraction {
void operation();
void setImplementor(Implementor implementor);
}
2.细化抽象类
代码如下(示例):
/ 修正抽象化类
class RefinedAbstraction implements Abstraction {
private Implementor implementor;
public void operation() {
implementor.operationImpl();
}
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
}
2.客户端调用
代码如下(示例):
// 客户端调用
public class Client {
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction();
Implementor implementorA = new ConcreteImplementorA();
Implementor implementorB = new ConcreteImplementorB();
abstraction.setImplementor(implementorA);
abstraction.operation(); // 输出:ConcreteImplementorA operation
abstraction.setImplementor(implementorB);
abstraction.operation(); // 输出:ConcreteImplementorB operation
}
}
三、桥接模式的优缺点
优点:
- 分离抽象与实现:桥接模式通过组合关系解耦了抽象和实现之间的继承关系,使得抽象和实现可以沿着自己的维度进行扩展,而不会受到对方的影响。
- 提高可扩展性:由于抽象和实现的分离,系统可以在多个维度上进行扩展,增加了系统的灵活性和可维护性。
- 减少子类的个数:在有多个维度变化时,如果不使用桥接模式,可能会产生大量的子类。桥接模式通过组合而非继承来解决问题,从而减少了子类的个数。
缺点:
- 上手难度较大:由于桥接模式涉及到抽象和实现的分离,这可能会增加系统的复杂性,对于初学者来说,理解和实现起来可能比较困难。
- 设计和实现的复杂性:桥接模式需要正确识别出系统中独立的两个变化维度,并分别对它们进行封装,这可能会增加设计和实现的难度。
- 可能过度设计:如果系统不需要在多个维度上独立变化,或者继承层次不会导致问题,那么使用桥接模式可能会导致过度设计。
四、应用场景
1.实现系统可能有多个角度分类,每一种角度都可能变化。
2.不希望在抽象和它的实现部分有一个固定绑定关系。
3.类的抽象以及它的实现都应该可以通过生成子类的方式来加以扩充。
4.对一个抽象的实现部分的修改对客户不产生影响。
总结
桥接模式提供了一种分离抽象和实现的方法,使得它们可以独立地变化。这种模式在处理多个类层次结构的系统时非常有用,它可以减少子类的个数,降低系统管理和维护的难度。然而,桥接模式也可能会增加系统的复杂性,因此在使用时需要权衡其利弊。