侧边栏壁纸
  • 累计撰写 98 篇文章
  • 累计创建 20 个标签
  • 累计收到 3 条评论

设计模式--桥接模式

林贤钦
2020-05-09 / 0 评论 / 9 点赞 / 638 阅读 / 0 字
温馨提示:
本文最后更新于 2020-05-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

桥接模式(Bridge Pattern)

1. 介绍

1.1 模式说明

将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

1.2 主要作用

降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量,降低系统的管理和维护成本。

可以保持各部分的独立性以及应对他们的功能扩展

1.3 解决的问题

解决原本用传统模式造成的类爆炸问题,符合设计模式的合成复用原则,ocp原则

提高扩展性、便于维护、防止类的体系庞大

抽象和实现可以独立的变化,扩展功能时,增加实现类即可;

2. 模式原理

2.1 桥接模式原理类图

2.2 桥接模式包含如下角色:

Abstraction:抽象类

维护了 Implementor / 即它的实现类 ConcreteImplementorA.., 二者是聚合关系, Abstraction充当桥接类

RefinedAbstraction:扩充抽象类

是 Abstraction 抽象类的子类

Implementor:实现类接口

行为实现类的接口

ConcreteImplementor:具体实现类

行为的具体实现类

  • Client 类:桥接模式的调用者

抽象类和接口是聚合的关系,其实调用和被调用关系

2.3 模式分析

理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。

• 抽象化:

​ 抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。

在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。

• 实现化:

针对抽象化给出的具体实现,就是实现化

抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。

• 脱耦:

​ 脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。

桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

2.4 典型的桥接模式代码

典型的实现类接口代码:

public interface Implementor
{
    public void operationImpl();
} 

典型的抽象类代码

public abstract class Abstraction
{
    protected Implementor impl;

    public void setImpl(Implementor impl)
    {
        this.impl=impl;
    }

    public abstract void operation();
} 

典型的扩充抽象类代码

public class RefinedAbstraction extends Abstraction
{
    public void operation()
    {        
        //代码
        impl.operationImpl();
        //代码
    }
} 

3. 实例讲解

3.1 实例概况

  • 背景
    有一只画笔,可以画正方形、长方形、圆形。现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。

3.2代码实现

步骤一:Abstraction:抽象类

该类为一个抽象类,主要提供画形状的方法 Shape.java

public abstract class Shape {
    Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

步骤二:RefinedAbstraction:扩充抽象类

三个形状 圆形 Circle.java & 长方形 Rectangle.java & 正方形 Square.java

public class Circle extends Shape{

    public void draw() {
        color.bepaint("圆形");
    }
}
public class Square extends Shape{

    public void draw() {
        color.bepaint("正方形");
    }
}
public class Rectangle extends Shape{

    public void draw() {
        color.bepaint("长方形");
    }
}

步骤三:Implementor:实现类接口

颜色接口 Color.java

public interface Color {
    public void bepaint(String shape);
}

步骤四: ConcreteImplementor:具体实现类

三个颜色 白色 White.java & 灰色 Gray.java & 黑色 Black.java

public class White implements Color{

    public void bepaint(String shape) {
        System.out.println("白色的" + shape);
    }
}
public class Black implements Color{

    public void bepaint(String shape) {
        System.out.println("黑色的" + shape);
    }
}
public class Gray implements Color{

    public void bepaint(String shape) {
        System.out.println("灰色的" + shape);
    }
}

步骤五:Client 类:桥接模式的调用者

public class Client {
    public static void main(String[] args) {
        //白色
        Color white = new White();
        //正方形
        Shape square = new Square();
        //白色的正方形
        square.setColor(white);
        square.draw();

        //长方形
        Shape rectange = new Rectangle();
        rectange.setColor(white);
        rectange.draw();
    }
}

结果:

白色的正方形
白色的长方形

4. 模式优缺点

优点

  • 分离抽象接口及其实现部分。

极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。

  • •桥接模式有时类似于多继承方案

但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

  • 桥接模式提高了系统的可扩充性

在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

• 实现细节对客户透明,可以对用户隐藏实现细节。

缺点

• 桥接模式的引入会增加系统的理解与设计难度,

由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

• 桥接模式要求正确识别出系统中两个独立变化的维度

因此其使用范围具有一定的局限性。

5. 应用场景

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

例如

  1. -JDBC 驱动程序

  2. -银行转账系统

转账分类: 网上转账,柜台转账,AMT 转账

转账用户类型:普通用户,银卡用户,金卡用户..

  1. -消息管理

消息类型:即时消息,延时消息

消息分类:手机短信,邮件消息,QQ 消息...

    • Java语言通过Java虚拟机实现了平台的无关性

模式扩展

适配器模式与桥接模式的联用

桥接模式和适配器模式用于设计的不同阶段

桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化;

而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式。但有时候在设计初期也需要考虑适配器模式,特别是那些涉及到大量第三方应用接口的情况。

9

评论区