java 中的桥模式实现
桥接模式将抽象与实现分离,以便两者可以独立变化。它是通过组合而不是继承来实现的。
来自维基百科的桥 UML 图:
这种模式中有四个组件。
Abstraction
:它定义了一个接口
RefinedAbstraction
:它实现了抽象:
Implementor
:它定义了一个实现接口
ConcreteImplementor
:它实现了 Implementor 接口。
The crux of Bridge pattern :
使用组合(没有继承)的两个正交类层次结构。抽象层次结构和实现层次结构可以独立变化。实现从未引用抽象。抽象包含实现接口作为成员(通过组合)。此组合减少了一个级别的继承层次结构。
真实用例:
使不同的车辆具有手动和自动齿轮系统的两种版本。
示例代码:
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
输出:
Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear
说明:
Vehicle
是一个抽象。Car
和Truck
是Vehicle
的两个具体实现。Vehicle
定义了一个抽象方法:addGear()
。Gear
是实现者接口ManualGear
和AutoGear
是Gear
的两个实现Vehicle
包含implementor
接口而不是实现接口。实现者接口的Compositon
是这种模式的关键: 它允许抽象和实现独立变化。Car
和Truck
为抽象定义实现(重新定义的抽象):addGear()
:它包含Gear
-Manual
或Auto
Bridge 模式的用例 :
- 抽象和实现可以彼此独立地更改,并且它们在编译时不受约束
- 映射正交层次结构 - 一个用于抽象,一个用于实现。