一、认识
我们先拿类图分析一下他的主要类:
在类图中出现了四个角色:
1.Abstraction 抽象化类
2.RefinedAbstraction 修正抽象化类
3.Implementation 实现化类
4.RealImplementation 具体实现化类
二、理解
看过一篇文章里面提到了一个例子比较形象,拿来帮助理解。
毛笔和蜡笔,我们有三个型号的笔头和五种颜色,
那么如果使用蜡笔就需要3*5个类去实现。并且需要注意的是:每当我们增加一种新笔头/颜色时类也在扩展。
那么如果使用毛笔,我们只需要准备三种型号的毛笔和五种颜色的墨即可,那需要的类就是3+5个,而且他们是相互独立的。这意味着我们要新增颜色/笔头增加RefinedAbstraction/RealImplementatio即可。
三、代码帮助再理解
其实一提到代码的话就比较简单了,我们先看一个通用的桥梁模式的代码。帮助理解上面提到的概念。
/**
* 抽象化角色
* 可以理解为我们文中的毛笔
* @author liyichen
*
*/
public abstract class Abstraction {
//对实现化角色的引用
protected Implementation impl;
//强制子类必须实现函数
public Abstraction(Implementation impl) {
super();
this.impl = impl;
}
//自身行为或是属性
public void draw() {
this.impl.showColor();
}
}
/*------------------------------分割-------------------*/
/**
* 实现化角色
* 可以理解为案例中的墨
* @author liyichen
*
*/
public interface Implementation {
public String showColor();
}
/**
* 具体抽象化角色 可以理解为粗头的毛笔
* @author liyichen
*
*/
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementation impl) {
super(impl);
}
//修正父类行为
@Override
public void draw() {
System.out.println("粗头毛笔和"+impl.showColor()+"墨在作画");
}
}
/*---------------------------------分割---------------------*/
/**
* 具体实现化类 就是具体墨的颜色了
* @author liyichen
*
*/
public class RealImplementation implements Implementation{
@Override
public String showColor() {
return "RED";
}
}
对于上层调用来说,可以随意组装。
public static void main(String[] args) {
Implementation r = new RealImplementation();
Abstraction a = new RefinedAbstraction(r);
a.draw();
}
result:
粗头毛笔和RED墨在作画
我只实现了其中一种情况,我们需要对业务再进行扩展的时候只需要再扩展他们对应的子类就好。
现在想来是不是比直接固定在一个类中的扩展性要强很多。
四、分析
其实通过刚才的例子桥梁的优点不言而喻:
1.抽象和实现分离。
其实它的出现主要就是为了解决继承的缺点,实现可以不受抽象的控制,不用再绑定在一个固定的抽象层次上。
2.优秀的拓展能力
刚才的例子中想再拓展实现,很容易吧。我们已将把变化可能性减到最小。
3.实现细节对上层透明
上层不用关心实现的细节,它已经由抽象层通过聚合完成了封装。什么意思嘞?(看看毛笔的具体实现的draw方法你就明白辽。)
OK,以上。不足之处欢迎指正。