橋接模式:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱爲柄體(Handle and Body)模式或接口(Interface)模式。
在軟件系統中,某些類型由於自身的邏輯,它具有兩個或多個維度的變化,那麼如何應對這種“多維度的變化”?如何利用面嚮對象的技術來使得該類型能夠輕鬆的沿着多個方向進行變化,而又不引入額外的複雜度?這就要使用Bridge模式。
以下例子展示了人,車,路三個維度的變化:
abstract class AbstractRoad{
void run(){};
}
abstract class AbstractCar{
protected AbstractRoad road;
protected AbstractCar(AbstractRoad road){
this.road = road;
}
void run(){};
}
abstract class People {
protected AbstractCar car;
peotected People(AbstractCar car){
this.car = car;
}
void run() {}
}
class Street extends AbstractRoad{
@Override
void run() {
System.out.println("在市區街道行駛");
}
}
class SpeedWay extends AbstractRoad{
@Override
void run() {
System.out.println("在高速公路行駛");
}
}
class Car extends AbstractCar{
public Car(AbstractRoad road){
super(road);
}
@Override
void run() {
System.out.print("小汽車");
road.run();
}
}
class Bus extends AbstractCar{
public Bus(AbstractRoad road){
super(road);
}
@Override
void run() {
System.out.print("公交車");
road.run();
}
}
class Man extends People{
public Man(Abstract car){
super(car);
}
@Override
void run() {
System.out.print("男人開着");
car.run();
}
}
class Woman extends People{
public Man(Abstract car){
super(car);
}
@Override
void run() {
System.out.print("女人開着");
car.run();
}
}
public static void main(String[] args) {
People man = new Man(new Car(new SpeedWay()));
man.run();
}
效果及實現要點:
1.Bridge模式使用“對象間的組合關係”解耦了抽象和實現之間固有的綁定關係,使得抽象和實現可以沿着各自的維度來變化。
2.所謂抽象和實現沿着各自維度的變化,即“子類化”它們,得到各個子類之後,便可以任意它們,從而獲得不同路上的不同汽車。
3.Bridge模式有時候類似於多繼承方案,但是多繼承方案往往違背了類的單一職責原則(即一個類只有一個變化的原因),複用性比較差。Bridge模式是比多繼承方案更好的解決方法。
4.Bridge模式的應用一般在“兩個非常強的變化維度”,有時候即使有兩個變化的維度,但是某個方向的變化維度並不劇烈——換言之兩個變化不會導致縱橫交錯的結果,並不一定要使用Bridge模式。