【桥接模式】

78 阅读2分钟

Bridgr Pattern

  • 桥接模式是一种结构型设计模式
  • 它将抽象部分与实现部分分离,使它们都可以独立地变化

桥接模式主要有以下几个角色:

一、抽象类(Abstraction)

定义抽象类的接口,维护一个指向实现部分对象的引用。

二、扩充抽象类(RefinedAbstraction)

扩充由抽象类定义的接口,通常在抽象类的基础上增加新的行为或属性。

三、实现类接口(Implementor)

定义实现部分的接口,这个接口不一定要与抽象类的接口完全一致,实际上,它们可以完全不同。实现类接口仅提供基本操作,而抽象类定义的是基于这些基本操作的较高层次的操作。

四、具体实现类(ConcreteImplementor)

实现接口,给出具体的实现。

业务

类图

设备device和功能function两个维度独立

classDiagram
    class Device {
        <<abstract>>
        -Function function
        +Device(Function)
        +operate()
    }
    class Lamp {
        +Lamp(Function)
        +operate()
    }
    class Function {
        <<interface>>
        +performFunction()
    }
    class TurnOn {
        +performFunction()
    }
    Device <|-- Lamp
    Device *-- Function
    Function <|.. TurnOn

代码

一、设备与功能场景

假设你正在开发一个智能家居系统,这个系统中有不同类型的设备(如灯、风扇、电视等),并且每个设备都有不同的功能(如开关、调节亮度、调节音量等)。如果不使用桥接模式,可能会为每个设备和功能的组合创建一个具体的类,这样会导致类的数量非常庞大,并且当需要添加新的设备或功能时,代码的修改会非常困难。

使用桥接模式可以将设备和功能分离,使得它们可以独立地变化

  1. 抽象类(设备抽象类):
abstract class Device {
    protected Function function;

    public Device(Function function) {
        this.function = function;
    }

    public abstract void operate();
}
  1. 扩充抽象类(具体设备类,如灯):
class Lamp extends Device {
    public Lamp(Function function) {
        super(function);
    }

    @Override
    public void operate() {
        System.out.println("Lamp is " + function.performFunction() + ".");
    }
}
  1. 实现类接口(功能接口):
interface Function {
    String performFunction();
}
  1. 具体实现类(具体功能类,如开灯功能):
class TurnOn implements Function {
    @Override
    public String performFunction() {
        return "turned on";
    }
}
  1. 客户端使用:
public class BridgePatternExample {
    public static void main(String[] args) {
        Function turnOn = new TurnOn();
        Device lamp = new Lamp(turnOn);
        lamp.operate();
    }
}

在这个场景中,设备和功能被分离成两个独立的层次,通过桥接模式可以方便地增加新的设备或功能,而不会影响到其他部分的代码。

框架中的应用

应用不明显

总结

如果系统中某个类存在两个独立变化的维度,通过桥接模式可以将这两个维度分离出来,使两者可以独立扩展。