当前位置: 首页 > news >正文

桥接模式

1.模式动机与定义

模式定义

  1. 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  2. 对象结构型模式,又称为柄体(Handle and Body)模式或接囗(Interface)模式
  3. 用抽象关联取代了传统的多层继承
  4. 将类之间的静态继承关系转换为动态的对象组合关系

2.模式结构与分析

模式结构

桥接模式包含如下角色

  1. Abstraction:抽象类:用于定义抽象类的接口,它一般是抽象类而不是接口。其中定义了一个Implementor(实现抽象类)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,可以包含抽象的业务方法,还可以包含具体的业务方法。
  2. RefinedAbstraction:扩充抽象类:扩充由Abstraction定义的接口,不再是抽象类而是具体类,实现定义中的抽象业务方法。
  3. Implementor:实现类接口:实现Implementor接口并具体实现它,在不同的concreteImplementor中提供基本操作的不同实现,在程序运行时,其对象将替换其父类对象,提供给客户端具体的业务操作方法。
  4. Concretelmplementor:具体实现类类:定义实现类的接口

模式分析

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

抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。

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

脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化:这就是桥接模式的用意。

//典型的实现类接口代码
public interface Implementor{public void operationImpl();
}//典型的抽象类代码
public abstract class Abstraction{protected Implementor impl;public void setlmpl(Implementor impl){this.impl=impl;}public abstract void operation();
}//典型的扩充抽象类代码
public class RefinedAbstraction extends Abstraction{public void operation(){//代码impl.operationImplO;//代码}
}

3.模式效果与应用

优点

分离抽象接口及其实现部分
可以取代多层继承方案,极大地减少了子类的个数
提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

缺点

会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者开始就要针对抽象层进行设计与编程

正确识别出系统中两个独立变化的维度并不是一件容易的事情

使用情况

  1. 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  2. 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  3. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  4. 不希望使用继承因为多层继承导致系统类的个数急剧增加的系统
http://www.jsqmd.com/news/168272/

相关文章:

  • 清华镜像支持IPv6访问配置说明
  • 解读C++中无符号整型的潜在陷阱
  • 数据采集与融合技术综合实践-途个开心-102302145-黄加鸿
  • PyTorch CUDA out of memory错误环境层面排查
  • Python调试技巧:pdb与Miniconda环境结合使用
  • Conda配置文件.condarc位置与优先级
  • Anaconda企业版成本高?Miniconda开源替代方案
  • GitHub Pages发布技术博客:结合Miniconda环境说明
  • SSH连接超时自动重连脚本编写示例
  • Linux下PyTorch安装教程GPU版本:基于Miniconda的轻量级方案
  • 技术大佬凭什么直接拍板就不解释?
  • Conda环境克隆:快速复制已有PyTorch配置
  • 使用VMware虚拟机群发苹果iMessage短信技术的核心原理与代码实现(教学分享)
  • 双欣环保深交所上市:募资近20亿 大涨187% 市值226亿
  • 数字频率计高精度测量算法:超详细版原理剖析
  • PyTorch GPU利用率低?先确认环境配置正确性
  • Miniconda环境变量PYTHONPATH设置技巧
  • HTML form表单收集用户对大模型反馈
  • ChatTTS:AI 语音逼真到像真人,但只能在家用?加个cpolar就能远程调用
  • Miniconda预编译包优势:避免源码编译耗时
  • 电压信号 vs. 电流信号
  • Jupyter魔法命令%time %load_ext实用技巧分享
  • 单精度浮点数转换:STM32平台深度剖析
  • S32DS安装教程:快速理解调试器连接方法
  • Miniconda安装包瘦身技巧:只为PyTorch留下必要的组件
  • Anaconda下载太慢?改用Miniconda+精选源完美替代
  • Docker网络配置:Miniconda容器访问外部API
  • Miniconda vs Anaconda:谁更适合部署大模型训练环境?
  • 工业控制中JLink驱动安装的深度剖析与实践
  • 系统学习Proteus与Keil协同仿真的完整方案