桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化
实现代码:
先定义接口:
- public interface Sourceable {
- public void method();
- }
分别定义两个实现类:
- public class SourceSub1 implements Sourceable {
- @Override
- public void method() {
- System.out.println(“this is the first sub!”);
- }
- }
- public class SourceSub2 implements Sourceable {
- @Override
- public void method() {
- System.out.println(“this is the second sub!”);
- }
- }
定义一个桥,持有Sourceable的一个实例:
- public abstract class Bridge {
- private Sourceable source;
- public void method(){
- source.method();
- }
- public Sourceable getSource() {
- return source;
- }
- public void setSource(Sourceable source) {
- this.source = source;
- }
- }
- public class MyBridge extends Bridge {
- public void method(){
- getSource().method();
- }
- }
测试类:
- public class BridgeTest {
- public static void main(String[] args) {
- Bridge bridge = new MyBridge();
- /*调用第一个对象*/
- Sourceable source1 = new SourceSub1();
- bridge.setSource(source1);
- bridge.method();
- /*调用第二个对象*/
- Sourceable source2 = new SourceSub2();
- bridge.setSource(source2);
- bridge.method();
- }
- }
output:
this is the first sub! this is the second sub!
这个例子确实很容易懂,无非就是具体实现可以通过桥重新设置,如测试代码中 分别申请了两个对象,set函数就起到了桥的左右,将具体的实现独立出来了,重新设置,再调用函数输出就不一样了,也就是实现了抽象和具体实现之间的解耦作用,
抽象部分和 实现部分进行分离 使得他们可以独立的变化,这里面的抽象指的是方法的抽象或者叫功能的抽象,不是类。
android中的应用:例子,不同的窗口与窗口的实现,不同的视图与视图的绘制 都是采用桥接模式
不同的手机有不同的窗口大小,android应用程序是怎么知道展现多大的窗口呢,
不同的手机视图之间的绘制也不同,采用的图片也不一样,
即使是同一款手机,由于硬件配置不一样,可能导致某些功能桥接选择的具体实现也不一样
其实这里面有人就说,这是适配吧,这听起来多么的像适配器啊,比如说屏幕适配,其实他们两个之间是有区别的,
桥接模式在程序启动之前就可以确定好,是使用哪个的,
适配器模式是把不同接口之间无法完成的合作 搞定,让他们能够共同作用为某件事工作
下面:
android系统中不同的视图构成的视图树与完成视图的绘制功能的类之间
这个类图关系很清楚的说明了,抽象部分和实现部分都是独立的,view是整个视图的基类,
抽象部分:具有绘制视图的子类
图中不同的视图如Button、ImageView、TextView构成了一个抽象派生层次视图树,在视图树中View是所有视图的根视图
实现部分:ondraw
View的绘制通过三个不同的能独立演化的类来实现:
1.Canvas(提供绘制表面)、
2.HardwareLayer(提供输出显示层)--硬件缓存
3.DisplayList(代表一个绘制操作)--硬件加速渲染
结果就是不同的视图(view,抽象子类)可以采用不同的绘制方法(实现部分)来实现
例如textview 一般就是采用在宿主窗口上绘制的,
surfaceview就是采用直接与硬件进行绘制了,GL