设计模式(10)结构型模式 - 桥接模式

前言

前面已经学了结构型模式、适配器模式
适配器模式是为了将类转变成客户需要的类
现在继续学习桥接模式

目录

  1. 现实案例
  2. 桥接模式
    2.1. 结构
  3. 使用案例
  4. 桥接模式的优缺点
  5. 使用场景
  6. 适配器模式与桥接模式
  7. 总结

现实案例

画画时,需要大、中、小三种大小的画笔,需要3种颜色
如果使用蜡笔,就需要9种蜡笔
如果使用毛笔,仅需准备3种不同大小的毛笔
(大致的例子)

使用蜡笔就是普通的方法,使用毛笔就是我们的桥接模式

桥接模式

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化,又称为柄体(Handle and Body)模式或接口(Interface)模式

上面的例子是对于两者维度(大小,颜色)的变化的系统
如果采用蜡笔绘画:
在这里插入图片描述
而桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量
UML图:
在这里插入图片描述

结构

桥接模式包含5个角色:

  • Abstraction:抽象类
  • RefinedAbstraction:扩充抽象类
  • Implementor:实现类接口
  • ConcreteImplementor:具体实现类
  • Client : 客户(使用者)

使用案例

使用桥接模式完成上面的例子

客户想使用什么类型就直接在客户类Client依赖

在这里插入图片描述

package com.company.Structural.Bridge;
//桥接模式

//实现类接口
interface Color{

    public void color();

}
//3个颜色具体实现类

class Yellow implements Color{


    @Override
    public void color() {
        System.out.println("颜色为Yellow");
    }
}

class Red implements Color{

    @Override
    public void color() {
        System.out.println("颜色为Red");
    }
}
class Blue implements Color{

    @Override
    public void color() {
        System.out.println("颜色为Blue");
    }
}

//抽象类
abstract class Pen{
    private Color color;

    public Pen(Color color) {
        this.color = color;
    }

    public void draw(){
        color.color();
    }
}
//3种型号的抽象类扩充
class SmallPen extends Pen{

    public SmallPen(Color color) {
        super(color);
    }

    @Override
    public void draw() {
        super.draw();
        System.out.println("画笔型号为small");
    }
}

class MiddlePen extends Pen{

    public MiddlePen(Color color) {
        super(color);
    }
    @Override
    public void draw() {
        super.draw();
        System.out.println("画笔型号为Middle");
    }
}

class BigPen extends Pen{

    public BigPen(Color color) {
        super(color);
    }
    @Override
    public void draw() {
        super.draw();
        System.out.println("画笔型号为Big");
    }
}

//客户开始绘画
public class Client {
    public static void main(String[] args) {
        Pen pen1=new BigPen(new Yellow());
        pen1.draw();
    }
}

代码明显减低多了

在这里插入图片描述

桥接模式的优缺点

优点:

  • 分离抽象接口及其实现部分
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
  • 实现细节对客户透明,可以对用户隐藏实现细节

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性

使用场景

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

  • 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用

一些应用

  1. Java语言的跨平台性
    这就是桥接模式的思想

各个应用程序可以调用操作系统,就是使用桥(Java虚拟机)

在这里插入图片描述

  1. JDBC驱动

程序能够使用数据库就是使用桥(JDBC驱动)
JDBC的driver接口,从桥接模式看,driver接口就是实现类接口,Mysql数据库、SqlServer数据库等就是具体实现类

适配器模式与桥接模式

前面学习的适配器模式
在这里插入图片描述
重点在与将不适合的类转变为客户需要的类,一般在程序设计的中期

桥接模式
在这里插入图片描述

重点在架起一个桥梁,将两个维度的变化分为抽象化和实现化两个角色,便于结合
,一般运用程序设计的初期

所以两种模式可以结合使用
在这里插入图片描述

总结

  1. 结构型模式- 桥接模式的作用将抽象部分与它的实现部分分离,让两个维度的变化可以分隔开,然后结合,简化程序,通俗的说就是将两种维度变化分开,然后架起一个桥梁连接
  2. 桥接模式有5个角色:实现类接口,具体实现类(完成一个维度的变化),抽象类(聚合实现类接口),扩充抽象类(完成另一个维度变化),客户类
  3. 桥接模式的优点:分离抽象接口及其实现部分;提高了系统的可扩充性;实现细节对客户透明
  4. 桥接模式的缺点:增加系统的理解与设计难度(需要识别两个维度的变化)
  5. 桥接模式适用场景:需要在构件的抽象化角色和具体化角色之间增加更多的灵活性(不像蜡笔那样静态的继承关系);
    抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响;
    当存在存在两个独立变化的维度;
    不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值