Bridge 设计模式允许您将抽象与实现分离。它是一种结构设计模式。
Bridge 设计模式有两个部分:
- 抽象
- 执行
这是一种将实现类封装在接口类内部的设计机制。
- 桥接模式允许抽象和实现独立开发,客户端代码可以只访问抽象部分而不必关心实现部分。
- 抽象是接口或抽象类,实现者也是接口或抽象类。
- 抽象包含对实现者的引用。抽象的孩子被称为精炼抽象,实现者的孩子是具体的实现者。由于我们可以在抽象中更改对实现者的引用,因此我们可以在运行时更改抽象的实现者。对实现者的更改不会影响客户端代码。
- 它增加了类抽象与其实现之间的松散耦合。
桥梁设计模式的UML图
桥梁设计模式的元素
- 抽象——桥梁设计模式的核心并定义了症结。包含对实现者的引用。
- Refined Abstraction – 扩展抽象,将更精细的细节向下一层。对实现者隐藏更精细的元素。
- 实现者——它定义了实现类的接口。这个接口不需要直接对应抽象接口,可以有很大的不同。抽象imp根据Implementer接口提供的操作提供了一个实现。
- 具体实现——通过提供具体实现来实现上述实现者。
让我们看一个桥接设计模式的例子:
// Java code to demonstrate
// bridge design pattern
// abstraction in bridge pattern
abstract class Vehicle {
protected Workshop workShop1;
protected Workshop workShop2;
protected Vehicle(Workshop workShop1, Workshop workShop2)
{
this.workShop1 = workShop1;
this.workShop2 = workShop2;
}
abstract public void manufacture();
}
// Refine abstraction 1 in bridge pattern
class Car extends Vehicle {
public Car(Workshop workShop1, Workshop workShop2)
{
super(workShop1, workShop2);
}
@Override
public void manufacture()
{
System.out.print("Car ");
workShop1.work();
workShop2.work();
}
}
// Refine abstraction 2 in bridge pattern
class Bike extends Vehicle {
public Bike(Workshop workShop1, Workshop workShop2)
{
super(workShop1, workShop2);
}
@Override
public void manufacture()
{
System.out.print("Bike ");
workShop1.work();
workShop2.work();
}
}
// Implementor for bridge pattern
interface Workshop
{
abstract public void work();
}
// Concrete implementation 1 for bridge pattern
class Produce implements Workshop {
@Override
public void work()
{
System.out.print("Produced");
}
}
// Concrete implementation 2 for bridge pattern
class Assemble implements Workshop {
@Override
public void work()
{
System.out.print(" And");
System.out.println(" Assembled.");
}
}
// Demonstration of bridge design pattern
class BridgePattern {
public static void main(String[] args)
{
Vehicle vehicle1 = new Car(new Produce(), new Assemble());
vehicle1.manufacture();
Vehicle vehicle2 = new Bike(new Produce(), new Assemble());
vehicle2.manufacture();
}
}
输出 :
Car Produced And Assembled.
Bike Produced And Assembled.
在这里,我们使用 Bridge 设计模式生产和组装两种不同的车辆。
当我们需要桥接设计模式时
桥接模式是旧建议的应用,“优先组合而不是继承”。当您必须以相互正交的方式对不同时间进行子类化时,它会变得很方便。
例如,上面的例子也可以这样做:
无桥接设计模式
但是上面的解决方案有问题。如果您想更改 Bus 类,那么您最终可能也会更改 ProduceBus 和 AssembleBus,如果更改是针对车间的,那么您可能还需要更改 Bike 类。
使用桥梁设计模式
您可以通过以下方式将 Vehicle 和 Workshop 接口解耦来解决上述问题。
好处
- 桥接模式将抽象与其实现解耦,以便两者可以独立变化。
- 它主要用于实现平台独立特性。
- 它增加了一个方法级别的重定向来实现目标。
- 在单独的继承层次结构中发布抽象接口,并将实现放在自己的继承层次结构中。
- 使用桥接模式来实现的运行时绑定。
- 使用桥接模式映射正交类层次结构
- Bridge 是预先设计的,让抽象和实现独立变化。