《Android源码设计模式解析与实战》读书笔记(二十四)——桥接模式

来源:互联网 发布:数据库高级编程 编辑:程序博客网 时间:2024/05/17 10:57

桥接模式也称为桥梁模式,在现实生活中桥是负责连接河道两岸的交通枢纽,桥接模式也类似,负责连接“两边”。


第二十四章 连接两地的交通枢纽——桥接模式

1.定义

将抽象部分和实现部分分离,使它们可以独立地进行变化。所以连接“两边”就是连接抽象部分和实现部分。


2.使用场景

1).一个系统需要在构建的抽象角色和具体角色间增加更多的灵活性,避免在两个层次之间建立静态的继承联系时。

2).不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

3).一个类存在两个独立变化的维度,且这两个维度都需要扩展时。


3).简单实现

桥接模式主要有四类角色:
抽象部分:一般为抽象类,该类持有一个实现部分的引用,抽象部分中的方法需要调用实现部分中的对象来实现。
具体抽象部分:抽象部分的具体实现类。
实现部分:一般为接口或抽象类,抽象部分的方法,一般是基于实现部分的。
具体实现部分:实现部分的实现类。

以吃牛排为例,牛排的种类不同,然后我们点餐的时候也会有不同的要求,比如五分熟、七分熟、全熟等。
AbstractSteak(抽象部分):
public abstract class AbstractSteak {    //持有实现部分的引用    protected IDone mIDone;    public AbstractSteak(IDone mIDone) {        this.mIDone = mIDone;    }    public abstract void makeSteak();}

FiletSteak(抽象部分的具体实现类):
public class FiletSteak extends AbstractSteak {    public FiletSteak(IDone mIDone) {        super(mIDone);    }    @Override    public void makeSteak() {        System.out.println("菲力牛排");        mIDone.done();    }}

SirloinSteak(抽象部分的具体实现类):
public class SirloinSteak extends AbstractSteak {    public SirloinSteak(IDone mIDone) {        super(mIDone);    }    @Override    public void makeSteak() {        System.out.println("西冷牛排");        mIDone.done();    }}

IDone(实现部分):
public interface IDone {    void done();}

FiveDone(实现部分的实现类)
public class FiveDone implements IDone {    @Override    public void done() {        System.out.println("五分熟");    }}

SevenDone(实现部分的实现类):
public class SevenDone implements IDone {    @Override    public void done() {        System.out.println("七分熟");    }}

客户端调用:
        IDone fiveDone = new FiveDone();        IDone sevenDone = new SevenDone();        AbstractSteak steak1 = new FiletSteak(fiveDone);        steak1.makeSteak();        AbstractSteak steak2 = new SirloinSteak(sevenDone);        steak2.makeSteak();

运行程序,打印如下:


因为抽象部分和实现部分分离开,并且抽象部分持有实现部分的引用,所以抽象部分可以拥抱更多实现部分的变化,比如再增加一个全熟的实现类:
public class AllDone implements IDone {    @Override    public void done() {        System.out.println("全熟");    }}

        IDone allDone = new AllDone();        AbstractSteak steak3 = new SirloinSteak(allDone);        steak3.makeSteak();
或者需要扩展抽象部分也是很方便的:
public class TBoneSteak extends AbstractSteak {    public TBoneSteak(IDone mIDone) {        super(mIDone);    }    @Override    public void makeSteak() {        System.out.println("T骨牛排");        mIDone.done();    }}

        AbstractSteak steak4 = new TBoneSteak(allDone);        steak4.makeSteak();

这就抽象部分和实现部分的解耦,事实上桥接模式不只局限于两个变化类之间,如果我们增加牛排的其他实现,比较浇什么汁:
public interface ISauce {    void sauce();}

public class BlackPepperSauce implements ISauce {    @Override    public void sauce() {        System.out.println("黑胡椒汁");    }}

public class TomatoSauce implements ISauce {    @Override    public void sauce() {        System.out.println("番茄汁");    }}

再在抽象部分中加入 ISauce 的引用:
public abstract class AbstractSteak {    //持有实现部分的引用    protected IDone mIDone;    protected ISauce mISauce;    public AbstractSteak(IDone mIDone, ISauce mISauce) {        this.mIDone = mIDone;        this.mISauce = mISauce;    }    public abstract void makeSteak();}

具体抽象部分,列举一个:
public class FiletSteak extends AbstractSteak {    public FiletSteak(IDone mIDone, ISauce mISauce) {        super(mIDone, mISauce);    }    @Override    public void makeSteak() {        System.out.println("菲力牛排");        mIDone.done();        mISauce.sauce();    }}

客户端完整调用:
        IDone fiveDone = new FiveDone();        IDone sevenDone = new SevenDone();        IDone allDone = new AllDone();        ISauce blackPepperSauce = new BlackPepperSauce();        ISauce tomatoSauce = new TomatoSauce();        AbstractSteak steak1 = new FiletSteak(fiveDone, blackPepperSauce);        steak1.makeSteak();        AbstractSteak steak2 = new SirloinSteak(sevenDone, blackPepperSauce);        steak2.makeSteak();        AbstractSteak steak3 = new SirloinSteak(allDone, tomatoSauce);        steak3.makeSteak();        AbstractSteak steak4 = new TBoneSteak(allDone, tomatoSauce);        steak4.makeSteak();

运行程序,结果如下:

所以桥接模式可以用于多维度变化类或者说是多个树状类之间的解耦。需要注意的是,桥接模式中的抽象类并不是抽象部分,桥接模式中的抽象部分和实现部分实质上对应的是两个不同的维度。

4.总结

桥接模式可以用到许多开发中,但是实际上用得也并不多,主要是因为对抽象部分和实现部分不好把握,是否应该分离和如何分离,都需要恰到好处的揣摩,所以它好理解,但是不好设计。
优点:
1).分离抽象部分与实现部分,扩展灵活。
缺点:
1).不容易设计。
Demo下载

到桥接模式看完,这本书也接近了尾声,还有两章介绍 MVC 和 MVP 模式的,但是那是属于应用架构设计模式,更大的两个点,所以打算单独学习。所有的 23 种设计模式包括创建型模式 5 种:单例模式、建造者模式、原型模式、工厂方法模式、抽象工厂模式,它们主要是用来创建对象的;行为型模式 11 种:策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、备忘录模式、迭代器模式、模版方法模式、访问者模式、中介者模式,它们主要是控制程序的行为的;结构性模式 7 种:代理模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式,它们主要是从程序的结构层次上进行优化,让结构更清晰从而达到解耦的目的。这第一遍我只是看了所有设计模式的概念部分,并通过简单的例子加以理解,书中深究的在 Android 源码中如何体现这些设计模式的,第一遍我还没有透彻的读,自己阅读源码的能力也还有限,准备先将这 23 种模式的基本原理再回过头梳理一遍,然后再深入研究源码,这些源码也涉及到很多常用的点,比如事件分发机制、跨进程通信机制、ViewGroup 的解析等等,一边提高自己能力的同时试着去阅读一下源码,相信会有更大的提高。
以前很长一段时间没有记博客,有时候遇到一些小问题会记到本子上,但是如果太长的,手写笔记有时候效率就不高了,感觉应该先写博客,然后等闲下来的时候再将这些博客摘录到笔记本上,双重保险(其实主要是为了练字)嘛。
希望自己在开发道路上越走越稳。


















阅读全文
0 0
原创粉丝点击