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
代码
一、设备与功能场景
假设你正在开发一个智能家居系统,这个系统中有不同类型的设备(如灯、风扇、电视等),并且每个设备都有不同的功能(如开关、调节亮度、调节音量等)。如果不使用桥接模式,可能会为每个设备和功能的组合创建一个具体的类,这样会导致类的数量非常庞大,并且当需要添加新的设备或功能时,代码的修改会非常困难。
使用桥接模式可以将设备和功能分离,使得它们可以独立地变化。
- 抽象类(设备抽象类):
abstract class Device {
protected Function function;
public Device(Function function) {
this.function = function;
}
public abstract void operate();
}
- 扩充抽象类(具体设备类,如灯):
class Lamp extends Device {
public Lamp(Function function) {
super(function);
}
@Override
public void operate() {
System.out.println("Lamp is " + function.performFunction() + ".");
}
}
- 实现类接口(功能接口):
interface Function {
String performFunction();
}
- 具体实现类(具体功能类,如开灯功能):
class TurnOn implements Function {
@Override
public String performFunction() {
return "turned on";
}
}
- 客户端使用:
public class BridgePatternExample {
public static void main(String[] args) {
Function turnOn = new TurnOn();
Device lamp = new Lamp(turnOn);
lamp.operate();
}
}
在这个场景中,设备和功能被分离成两个独立的层次,通过桥接模式可以方便地增加新的设备或功能,而不会影响到其他部分的代码。
框架中的应用
应用不明显
总结
如果系统中某个类存在两个独立变化的维度,通过桥接模式可以将这两个维度分离出来,使两者可以独立扩展。