桥接模式 (Bridge)
将抽象部分与实现部分分离,使它们都可以独立的变化。
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
效果及实现要点:
(1) Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
(2) Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
拿汽车在路上行驶的来说。即有小汽车又有公共汽车,它们都不但能在市区中的公路上行驶,也能在高速公路上行驶。这你会发现,对于交通工具(汽车)有不同的类型,然而它们所行驶的环境(路)也在变化,在软件系统中就要适应两个方面的变化?怎样实现才能应对这种变化呢?
// 抽象路 public abstract class AbstractRoad { protected AbstractCar car; public AbstractCar getCar() { return car; } public void setCar(AbstractCar car) { this.car = car; } public abstract void run(); } // 高速公路 public class SpeedWay extends AbstractRoad { public void run() { car.run(); System.out.println("高速公路上行驶"); } } // 市区街道 public class Street extends AbstractRoad { public void run() { car.run(); System.out.println("市区街道上行驶"); } } // 抽象汽车 public abstract class AbstractCar { public abstract void run(); } // 小汽车; public class Car extends AbstractCar { public void run() { System.out.println("小汽车在"); } } // 公共汽车 public class Bus extends AbstractCar { public void run() { System.out.println("公共汽车在"); } } public class Client { public static void main(String[] args) { // 小汽车在高速公路上行驶; AbstractRoad road1 = new SpeedWay(); road1.setCar(new Car()); road1.run(); // 公共汽车在高速公路上行驶; AbstractRoad road2 = new SpeedWay(); road2.setCar(new Bus()); road2.run(); } }
增加一个维度"人",不同的人开着不同的汽车在不同的路上行驶(三个维度)
public abstract class People { protected AbstractRoad road; public AbstractRoad getRoad() { return road; } public void setRoad(AbstractRoad road) { this.road = road; } public abstract void run(); } public class Man extends People { public void run() { System.out.println("男人开着"); road.run(); } } public class WoMan extends People { public void run() { System.out.println("女人开着"); road.run(); } } public class Client { public static void main(String[] args) { // 男人开着公共汽车在高速公路上行驶; AbstractRoad road3 = new SpeedWay(); road3.setCar(new Bus()); People p = new Man(); p.setRoad(road3); p.run(); } }
桥接模式很好的符合了开放-封闭原则和优先使用合成(而不是继承)这两个面向对象原则组合模式