桥梁模式的定义
Decouple an abstraction from its implementation so that the two can vary independenty.(将抽象的实现解耦,使得两者可以独立的变化)
桥梁模式的应用
-
桥梁模式的优点
重点内容抽象和实现分离
这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。
优秀的扩充能力
看看我们的例子,想增加实现?没问题!想增加抽象,也没有问题!只要对外暴露的接口层允许这样的变化,我们已经把变化的可能性减到最小。
实现细节对客户透明
客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。 -
桥梁模式的缺点
必须知道选择哪一种类型的实现。
-
桥梁模式的使用场景。
1.不希望或不适用使用继承的场景。例如继承层次过度,无法更细化设计颗粒等场景
2.接口或抽象类不稳定的场景。明知道接口不稳定还想通过实现或继承来实现业务需要,那是得不偿失的,也是比较失败的做法
3.重用性要求比较高的场景。设计的颗粒度越细,则被重用的可能性就越大,而采用继承则受父类的限制,不可能出现太细的颗粒度
桥梁模式的实现
/**
* 抽象化角色
*/
public abstract class Abstraction {
//定义对实现化角色的引用
private Implementor imp;
//约束子类必须实现该构造函数
public Abstraction(Implementor _imp) {
this.imp = _imp;
}
//自身的行为和属性
public void request() {
this.imp.doSomething();
}
//获得实现化角色
public Implementor getImp() {
return imp;
}
}
/**
* 实现化角色
*/
public interface Implementor {
//基本方法
public void doSomething();
public void doAnything();
}
/**
* 具体实现化角色
*/
public class ConcreteImplementor2 implements Implementor {
public void doSomething() {
System.out.println("业务逻辑处理 ConcreteImplementor2 doSomething");
}
public void doAnything() {
System.out.println("业务逻辑处理 ConcreteImplementor2 doAnything");
}
}
/**
* 具体实现化角色
*/
public class ConcreteImplementor1 implements Implementor {
public void doSomething() {
System.out.println("业务逻辑处理 ConcreteImplementor1 doSomething");
}
public void doAnything() {
System.out.println("业务逻辑层处理 ConcreteImplementor1 doAnything");
}
}
public class RefindAbstraction extends Abstraction {
public RefindAbstraction(Implementor _imp) {
super(_imp);
}
//修正父类的行为
public void request() {
/**
* 业务处理
*/
super.request();
super.getImp().doAnything();
}
}
/**
* 场景类
*/
public class Main {
public static void main(String[] args) {
//定义一个实现化角色
Implementor imp = new ConcreteImplementor1();
//定义一个抽象化角色
Abstraction abs = new RefindAbstraction(imp);
//执行行文
abs.request();
}
}
桥梁模式在源码中的应用
Framework 内部的源码实现中,比较典型的桥接模式应用是 Window 与 WindowManager 之间的关系。在 fwk 中 Window 和 PhoneWindow 构成窗口的抽象部分,其中 Window 类为该抽象部分的抽象接口,PhoneWindow 为抽象部分具体的实现及扩展。而 WindowManager 则为实现部分的基类,WindowManagerImpl 为实现部分具体的逻辑实现,其使用 WindowManagerGlobal 通过 IWindowManager 接口与 WindowManagerService (也就是 WMS)进行交互,并由 WMS 完成具体的窗口管理工作