桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。” 桥接模式通过将一个类的抽象部分与实现部分分离开来,使它们可以独立地进行扩展和修改。
在桥接模式中,有两个核心概念:
通过桥接模式,抽象部分和实现部分可以独立地发展和演化,不会相互影响。这种解耦可以提高系统的灵活性和可扩展性。桥接模式常用于以下情况:
以下是桥接模式的结构示意图:
classDiagram
class Abstraction {
+ implementor: Implementor
+ operation(): void
}
class RefinedAbstraction {
+ operation(): void
}
class Implementor {
+ operationImpl(): void
}
class ConcreteImplementorA {
+ operationImpl(): void
}
class ConcreteImplementorB {
+ operationImpl(): void
}
Abstraction <|-- RefinedAbstraction
Abstraction o-- Implementor
Implementor <|.. ConcreteImplementorA
Implementor <|.. ConcreteImplementorB
Abstraction(抽象化角色)通过持有Implementor(实现化角色)的引用,将操作委托给Implementor来实现。RefinedAbstraction(扩充抽象化角色)继承自Abstraction,并可以在基础操作上添加额外的功能。Implementor(实现化角色)是一个接口或抽象类,定义了在Abstraction中使用的操作方法。ConcreteImplementorA和ConcreteImplementorB(具体实现化角色)实现了Implementor接口,并提供了具体的操作实现。
在桥接模式中,抽象部分通过聚合(或组合)实现部分的对象来实现功能。通过定义抽象部分和实现部分的接口,以及维护它们之间的关联关系,可以实现抽象部分与实现部分的解耦和独立变化。
在Java开源项目中,桥接模式有许多应用场景。以下是其中几个示例:
这些示例说明了在Java开源项目中桥接模式的应用。通过桥接模式,可以将不同维度的变化解耦,在代码的可扩展性和灵活性方面提供支持。
首先,定义抽象部分的接口或抽象类。这个接口或抽象类将定义高层操作或功能,并将包含一个对实现部分的引用。例如:
public interface Shape {
void draw();
}
接下来,创建实现部分的接口或抽象类。这个接口或抽象类将定义实现部分的操作或功能。例如:
public interface Color {
void fill();
}
然后,实现具体的实现部分类。这些类将实现实现部分的接口或抽象类。例如:
public class Red implements Color {
@Override
public void fill() {
System.out.println("Filling with red color");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Filling with blue color");
}
}
在抽象部分的接口或抽象类中添加对实现部分的引用,并在其中定义具体的操作。例如:
public abstract class AbstractShape implements Shape {
protected Color color;
public AbstractShape(Color color) {
this.color = color;
}
public abstract void draw();
}
最后,创建具体的抽象部分类。这些类将扩展抽象部分的接口或抽象类,并实现具体的操作。例如:
public class Circle extends AbstractShape {
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("Drawing a circle. ");
color.fill();
}
}
public class Rectangle extends AbstractShape {
public Rectangle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("Drawing a rectangle. ");
color.fill();
}
}
现在,可以使用桥接模式来创建抽象部分和实现部分之间的桥接:
// 创建实现部分的对象
Color red = new Red();
Color blue = new Blue();
// 创建抽象部分的对象并进行桥接
Shape redCircle = new Circle(red);
Shape blueRectangle = new Rectangle(blue);
// 调用抽象部分的方法,它会委派给实现部分的对象
redCircle.draw(); // Output: Drawing a circle. Filling with red color
blueRectangle.draw(); // Output: Drawing a rectangle. Filling with blue color
以上内容基于GPT创建和整理。
来自一线全栈程序员nine的八年探索与实践,持续迭代中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。