(《设计模式解析与实战——何红辉,关爱民》读书笔记)
一、定义
将抽象部分与实现部分分离,使它们都可以独立的进行变化。
二、使用场景
(1)任何多维度变化类或者说多个树状类之间的耦合都可以使用桥接模式来实现解耦;
(2)如果一个系统需要在构件的抽象角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,可以通过桥接模式使它们在抽象层建立一个关联关系;
(3)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,也可以考虑使用桥接模;
(4)一个类存在两个独立变化的纬度,且这两个纬度都需要进行扩展。
三、桥接模式的简单示例
(书中的代码有一点点问题,本人稍微修改了一下)
package com.bridge.pattern;
/**
* 抽象部分的实现:该类保持一个对实现部分对象的引用。
*/
public abstract class Abstraction {
// 声明一个私有成员变量引用实现部分的对象
private Implementor impl;
public Implementor getImpl() {
return impl;
}
public void setImpl(Implementor impl) {
this.impl = impl;
}
/**
* 通过实现部分的引用构造抽象部分的对象
* @param implementor 实现部分对象的引用
*/
public Abstraction(Implementor impl) {
this.impl = impl;
}
/**
* 通过调用实现部分具体的方法实现具体的功能(比如不同人可以穿不同的衣服,不同汽车装不同的引擎)
*/
public abstract void operation();
}
/**
* 抽象部分的子类:抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展
*/
public class RefinedAbstractionA extends Abstraction {
public RefinedAbstractionA(Implementor impl) {
super(impl);
}
@Override
public void operation() {
System.out.print("我是男人!");
this.getImpl().operationImpl();
}
}
/**
* 抽象部分的子类:抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展
*/
public class RefinedAbstractionB extends Abstraction {
public RefinedAbstractionB(Implementor impl) {
super(impl);
}
@Override
public void operation() {
System.out.print("我是女人!");
this.getImpl().operationImpl();
}
}
/**
* 实现部分的抽象接口
*/
public abstract class Implementor {
/**
* 实现抽象部分的具体方法
* @return 具体方法(功能)
*/
public abstract void operationImpl();
}
/**
* 实现部分具体的实现一:完善实现部分中方法定义的具体逻辑
*/
public class ConcreteImplementorA extends Implementor{
@Override
public void operationImpl() {
// 具体的实现
System.out.println("今天穿白色衣服!");
}
}
/**
* 实现部分具体的实现二:完善实现部分中方法定义的具体逻辑
*/
public class ConcreteImplementorB extends Implementor{
@Override
public void operationImpl() {
// 具体的实现
System.out.println("今天穿黑色衣服!");
}
}
/**
* 客户类
*/
public class Client {
public static void main(String[] args) {
// 客户调用逻辑
ConcreteImplementorA a = new ConcreteImplementorA();// 穿白色衣服
ConcreteImplementorB b = new ConcreteImplementorB();// 穿黑色衣服
// 男人:穿白色衣服
RefinedAbstractionA abstractionA1 = new RefinedAbstractionA(a);
abstractionA1.operation();
// 男人:穿黑色衣服
RefinedAbstractionA abstractionA2 = new RefinedAbstractionA(b);
abstractionA2.operation();
// 女人:穿白色衣服
RefinedAbstractionB abstractionB1 = new RefinedAbstractionB(a);
abstractionB1.operation();
// 女人:穿黑色衣服
RefinedAbstractionB abstractionB2 = new RefinedAbstractionB(b);
abstractionB2.operation();
}
}
运行结果:
四、总结
桥接模式可以应用到许多开发中,但是它的应用的却不多,一个很重要的原因是对于抽象与实现的分离的把握,是不是需要分离、如何分离。
优点:
(1)分离抽象与实现;
(2)灵活的扩展;
(3)对客户透明的实现。
缺点:
较复杂,虽然理解简单,但不容易设计。