java 桥接模式

桥接模式

    • 桥接模式简介
    • 桥接模式的实现
    • 总结

桥接模式简介

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

桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

桥接模式的实现

桥接(Bridge)模式包含以下主要角色。

抽象化(Abstraction)角色: 定义抽象类,并包含一个对实现化(Implementor)角色的引用。Abstraction 充当桥接类。
扩展抽象化(Refined Abstraction)角色: 是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。
实现化(Implementor)角色: 定义实现化角色的接口,供扩展抽象化(Refined Abstraction)角色调用。
具体实现化(Concrete Implementor)角色: 给出实现化(Implementor)角色接口的具体实现。

  1. 定义实现化角色的接口:
public interface Brand {void open();void close();void call();
}
  1. 定义具体实现化角色:给出实现化(Implementor)角色接口的具体实现。

    定义具体实现化角色1:

public class XiaoMi implements Brand{@Overridepublic void open() {System.out.println("小米手机开机");}@Overridepublic void close() {System.out.println("小米手机关机");}@Overridepublic void call() {System.out.println("小米手机打电话");}
}

定义具体实现化角色2:

public class Vivo implements Brand{@Overridepublic void open() {System.out.println("Vivo手机开机");}@Overridepublic void close() {System.out.println("Vivo手机关机");}@Overridepublic void call() {System.out.println("Vivo手机打电话");}
}
  1. 定义抽象化(Abstraction)角色:里面包含了对实现化角色的接口的引用
public abstract class Phone {//组合Brand接口private Brand brand;public Phone(Brand brand){super();this.brand = brand;}//调用接口里的方法,当该类的子类调用该类的方法时就会调用到接口里的方法protected void open(){brand.open();}protected void close(){brand.close();}protected void call(){brand.call();}
}
  1. 定义扩展抽象化(Refined Abstraction)角色:是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。
public class FoldedPhone extends Phone{public FoldedPhone(Brand brand){super(brand);//调用父类的构造器初始化}public void open(){super.open();//通过组合关系调用实现化(Implementor)角色中的业务方法System.out.println("折叠样式手机");}public void close(){super.close();System.out.println("折叠样式手机");}public void call(){super.call();System.out.println("折叠样式手机");}
}
  1. 定义客户端测试桥接模式:
public class Client {public static void main(String[] args) {FoldedPhone phone = new FoldedPhone(new XiaoMi());phone.open();phone.close();phone.call();System.out.println();FoldedPhone phone1 = new FoldedPhone(new Vivo());phone1.open();phone1.close();phone1.call();}
}

在这里插入图片描述
当我们要增加一个扩展抽象化(Refined Abstraction)角色,只需继承抽象化(Abstraction)角色(桥接类)即可.

总结

优点:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

缺点:

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难题

注意事项:

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

  • 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

  • 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。

  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

桥接模式通常适用于以下场景:

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/87873.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(…

领英采用 Protobuf 进行微服务开发,网络延迟降低60%

领英采用 Protobuf,以实现其各类平台中更为高效的微服务间数据传递,并将其与开源框架 Rest.li 相集成。在全公司范围的推广完成后,领英将延迟降低了 60%的同时,也提高了资源的利用率。 领英平台所采用的是微服务架构,…

ssm+vue理发店会员管理系统源码和论文

ssmvue理发店会员管理系统源码和论文089 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用&a…

windows下Node版本的切换方式

为了避免应用构建出错,我们在本地开发环境的 Node 版本与在 CI/CD 流程中指定的 Node 版本需保持一致。在这种需要频繁切换 Node 版本的情况下,我们不可能手动卸载又安装不同的版本,这时我们可以借助 NVM 工具来帮助我们快速地切换 Node 版本…

苹果支付外包开发流程

苹果支付的实现流程主要涉及集成苹果的支付系统——Apple Pay,以及在你的应用中处理支付交易。以下是一个简要的实现流程概述,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.开发者账号…

合宙Air724UG LuatOS-Air LVGL API控件--进度条 (Bar)

进度条 (Bar) Bar 是进度条,可以用来显示数值,加载进度。 示例代码 – 创建进度条 bar lvgl.bar_create(lvgl.scr_act(), nil) – 设置尺寸 lvgl.obj_set_size(bar, 200, 20); – 设置位置居中 lvgl.obj_align(bar, NULL, lvgl.ALIGN_CENTER, 0, 0) …

PDF校对:让您的文件无瑕疵

无论您是企业家、学生、教育者还是作家,我们都知道,提交或发布一个充满错误的PDF文件可能会给您的声誉或品牌带来严重损害。这就是为什么PDF校对如此关键的原因。现在,让我们深入了解PDF校对的重要性,以及如何确保您的文件尽可能完…

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节? numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容? 答案:[1 2 3 7 5 6] 当for语句被执行…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字:阿玥的小东东 学习:Python、C/C 主页链接:阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…

驾驶员监控系统DMS系统功能规范

概述 文档范围 该文档阐述了DMS系统的功能场景、系统组成、接口需求等。 目的 该功能规范为DMS系统及周边件的开发提供参考。 缩写与定义 英文缩写 英文全称 中文描述 DMS: Driver Monitoring System 驾驶员监控系统 MPU: Micro Processor Unit 微处理器单元 IECU: …

[Unity]UI和美术出图效果不一致

问题描述:美术使用PS在Gamma空间下设计的UI图,导入到Unity,因为Unity使用的是线性空间,导致半透明的UI效果和美术设计的不一致。 解决方案: (一)让美术在线性空间下工作 (二&…

数据结构之哈希

哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 4. 哈希的应用4.1 位图4.2 布隆过滤器 哈希(Hash)是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式,也是一种常见的检索方…