一、概述
将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式。比如存在2个维度,第一个维度有一个抽象类A和对应的子类A1和A2;第二个维度有另一个接口B和对应的子类B1和B2;接口A依赖接口B。
所谓的独立变化就是当我们修改A1和A2或是修改B1和B2对方都不用修改。这种抽象依赖就像桥接。
二、示例
比如上图所示:动物(抽象类)走路(接口),动物有狗(具体类)和猫(具体类),路有大路(具体类)和小路(具体类),要实现的就是 “什么动物在什么路走路”,这就是一个2维度组合,而且2个维度都可以进行独立变化。
1)动物接口
public interface Animal { void walk(); }
2)动物实现类
public class Dog implements Animal { public void walk() { System.out.println("狗走路"); } }
public class Cat implements Animal { public void walk() { System.out.println("猫走路"); } }
3)路抽象类
public abstract class Road { protected Animal animal; public Road(Animal animal){ this.animal = animal; } public abstract void place(); }
4)路的实现类
public class BigRoad extends Road { public BigRoad(Animal animal) { super(animal); } public void place() { System.out.println("在大路上"); animal.walk(); } }
package bridge.demo; /** * @author Administrator * @date 2019/01/11 */ public class SmallRoad extends Road{ public SmallRoad(Animal animal) { super(animal); } public void place() { System.out.println("在小路上"); animal.walk(); } }
5)测试类
public class Client { public static void main(String[] args){ Animal dog = new Dog(); Animal cat = new Cat(); Road road1= new BigRoad(dog); Road road2= new SmallRoad(cat); Road road3= new SmallRoad(dog); Road road4= new SmallRoad(cat); road1.place(); road2.place(); road3.place(); road4.place(); } }
在大路上
狗走路
在小路上
猫走路
在小路上
狗走路
在小路上
猫走路
细心的人会发现:桥接模式与抽象工厂模式很相似,都是2个维度上的变化。但是有以下区别:
- 桥接模式属于结构型模式,不是以创建对象的为目的,一般对象的创建是交给Client类去new 一个对象,对象已经存在后,怎么来组合使用这些对象;
- 抽象工厂模式属于创建型模式,以创建对象为目的,一般会在工厂类内部提供new 一个对象的方法。