GOF(七)-桥接模式【推荐】

桥接模式( Bridge Pattern)

桥接,顾名思义是为了连接两个对象,所以是结构型

桥接模式是为了将抽象化与实现化解耦,让二者可以独立地变化【注意:是独立变化】。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

桥接模式能够方便的对每一部分扩展,以及单独的维护。抽象化的一方与实现化的一方之间建立一个桥梁,这样两者的依赖关系就可以通过这个桥梁来建立了。


UML的相关知识,可以访问我的另外一篇博文
GOF(七)-桥接模式【推荐】_第1张图片
这幅UML可以拆解为四大部分:抽象化角色(Abstraction)、实现化角色(Implementor)、抽象化扩展角色(RefinedAbstraction)、具体实现化角色(ConcreteImplementor)。 若是忽略中间的聚合关系(棱形+箭头)不看,可以划分为左右两部分,这两部分可以独立的扩展。
GOF(七)-桥接模式【推荐】_第2张图片
桥接模式的优缺点放到最后讲解


这回举的例子是:小马过桥之后到达草原。
由于是左边的类聚合右边的类,所以桥接模式我习惯先写右边
实现化角色(Implementor)【小马过的桥】

/**
 * @description:
 * 实现化角色(只是一个普通接口)
 *    在桥接模式中抽象程度仅次于抽象化角色
 */
public interface IBridge {

    void target();
}

具体实现化角色(ConcreteImplementor)【小马的目的地草原】

/**
 * @description:
 * 草地:具体的实现化角色
 */
public class Grassland implements IBridge {
    @Override
    public void target() {
        System.out.println("通过桥,到达草地!");
    }
}

抽象化角色(Abstraction)【小马的抽象类 Animal】

/**
 * @description:
 * 抽象化角色(将其理解为桥接模式中抽象程度最高的类)
 */
public abstract class Animal {

    // 实现化角色的引用
    protected IBridge bridge;

    public abstract void wileGo();
}

抽象化扩展角色(RefinedAbstraction)【小马】

/**
 * @description:
 * 小马
 */
public class Horse extends Animal {
    @Override
    public void wileGo() {
        System.out.println("小马要过桥");
    }
}

测试代码:

    public static void main(String[] args) {

        Animal horse = new Horse();

        horse.wileGo();

        // 通过桥接模式调用,如果不赋初值,会报空指针异常
        horse.bridge = new Grassland();
        horse.bridge.target();

        System.out.println("----两个方法也可以各自独立使用,互不干扰----");
        Animal horse2 = new Horse();
        horse2.wileGo();

        Grassland grassland = new Grassland();
        grassland.target();
    }

测试结果:

小马要过桥
通过桥,到达草地!
----两个方法也可以各自独立使用,互不干扰----
小马要过桥
通过桥,到达草地!

优点
1、分离抽象和实现部分
分离了抽象和实现部分,提高了系统的灵活性,这样有助于对系统进行分层,从而产生更好的结构化的系统。
2、更好的扩展性
因为抽象部分和实现部分分离开了,所以这两部分可以独立扩展,互不影响,大大提高了系统的可扩展性。
3、可动态切换
由于分离了抽象和实现,那么在实现桥接的时候,可以实现动态的选择和使用具体的实现,也就是在运行期间动态切换实现。
4、减少了子类的数量
从抽象和实现两个维度来看,如果不是用桥接模式的话,这两个维度的子类,在发生变化时影响到的数量是两个维度子类的乘积。而使用了桥接模式后影响到的数量是两个维度的子类的和

缺点
1、桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程

2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。


总结:主体类的实现类和抽象的实现类分别可以在两个维度上进行各自的变化。如果主体类依赖多个抽象,则维度进行增加,方便扩展

桥接模式是一个非常有用的模式,在桥接模式中体现了很多面向对象设计原则的思想,包括“单一职责原则”、“开闭原则”、“合成复用原则”、“里氏代换原则”、“依赖倒转原则”等。


代码已经上传到Git:请点击访问

如果大家对于桥接模式还有更多的使用技巧和使用心得,欢迎评论并在评论中分享自己的链接!

你可能感兴趣的:(GOF)