结构型模式之桥接模式
一.定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
二、模式结构成员构成
• Abstraction:抽象类
• RefinedAbstraction:扩充抽象类
• Implementor:实现类接口
• ConcreteImplementor:具体实现类
三.代码示例
1 /** 2 * Abstraction类: 3 * 抽象类 4 */ 5 public abstract class Car { 6 7 private Engine engine; 8 9 public Car(Engine engine) { 10 this.engine = engine; 11 } 12 13 public Engine getEngine() { 14 return engine; 15 } 16 17 public void setEngine(Engine engine) { 18 this.engine = engine; 19 } 20 21 public abstract void installEngine(); 22 } 23 24 /** 25 * Refined Abstraction类: 26 * 扩充抽象类 27 */ 28 public class Bus extends Car { 29 30 public Bus(Engine engine) { 31 super(engine); 32 } 33 34 @Override 35 public void installEngine() { 36 System.out.print("Bus:"); 37 this.getEngine().installEngine(); 38 } 39 40 } 41 42 /** 43 * Refined Abstraction类: 44 * 扩充抽象类 45 */ 46 public class Jeep extends Car { 47 48 public Jeep(Engine engine) { 49 super(engine); 50 } 51 @Override 52 public void installEngine() { 53 System.out.print("Jeep:"); 54 this.getEngine().installEngine(); 55 } 56 57 } 58 59 /** 60 * Implementor类: 61 * 实现类接口 62 */ 63 public interface Engine { 64 65 /** 66 * 安装发动引擎 67 */ 68 public void installEngine(); 69 } 70 71 /** 72 * ConcreteImplementor类: 73 * 具体实现类 74 */ 75 public class Engine2000 implements Engine { 76 77 @Override 78 public void installEngine() { 79 System.out.println("安装2000CC发动引擎"); 80 } 81 82 } 83 84 /** 85 * ConcreteImplementor类: 86 * 具体实现类 87 */ 88 public class Engine2200 implements Engine { 89 90 @Override 91 public void installEngine() { 92 System.out.println("安装2200CC发动引擎"); 93 } 94 95 } 96 97 /** 98 * Client类: 99 */ 100 public class MainClass { 101 public static void main(String[] args) { 102 Engine engine2000 = new Engine2000(); 103 Engine engine2200 = new Engine2200(); 104 105 Car bus = new Bus(engine2000); 106 bus.installEngine(); 107 108 Car jeep = new Jeep(engine2200); 109 jeep.installEngine(); 110 } 111 }
四.优点和缺点分析
优点:
>分离抽象接口及其实现部分
>桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
缺点:
>桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
>桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
五.应用场景
>一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
>抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
>虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
>对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
你投入得越多,就能得到越多得价值