📜  桥梁设计模式

📅  最后修改于: 2021-09-10 02:53:07             🧑  作者: Mango

Bridge 设计模式允许您将抽象与实现分离。它是一种结构设计模式。
Bridge 设计模式有两个部分:

  1. 抽象
  2. 执行

这是一种将实现类封装在接口类内部的设计机制。

  • 桥接模式允许抽象和实现独立开发,客户端代码可以只访问抽象部分而不必关心实现部分。
  • 抽象是接口或抽象类,实现者也是接口或抽象类。
  • 抽象包含对实现者的引用。抽象的孩子被称为精炼抽象,实现者的孩子是具体的实现者。由于我们可以在抽象中更改对实现者的引用,因此我们可以在运行时更改抽象的实现者。对实现者的更改不会影响客户端代码。
  • 它增加了类抽象与其实现之间的松散耦合。

桥梁设计模式的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 接口解耦来解决上述问题。

好处

  1. 桥接模式将抽象与其实现解耦,以便两者可以独立变化。
  2. 它主要用于实现平台独立特性。
  3. 它增加了一个方法级别的重定向来实现目标。
  4. 在单独的继承层次结构中发布抽象接口,并将实现放在自己的继承层次结构中。
  5. 使用桥接模式来实现的运行时绑定。
  6. 使用桥接模式映射正交类层次结构
  7. Bridge 是预先设计的,让抽象和实现独立变化。