设计模式-桥接模式

news/2024/11/15 3:15:26/

桥接模式

  • 问题背景
  • 解决方案:桥接模式
  • 代码示例
  • 注意事项和细节

问题背景

我们对不同手机类型不同品牌实现基本操作(开机,关机,上网,打电话等等)
在这里插入图片描述
我们传统解决方式就是在排列组合,然后在类中去实现手机的功能,很明显,这样的缺点就是类爆炸,而且每一个类都要实现功能,非常繁琐。

解决方案:桥接模式

我们直接来看桥接模式原理UML类图:

在这里插入图片描述
我们来解释一下这个类图:
1)Clinet类:桥接模式的调用者
2)Abstraction抽象类:维护了Implementer接口和它的实现类,和Implementer是聚合关系,Abstraction充当桥接类
3)RefinedAbstraction类:是Abstraction抽象类的子类
4)Abstraction充当桥的作用,将他的子类和Implementor的实现类聚合在一起,这样就可以很方便的扩展。

我们来将这个类图转化为我们上面问题解决方案的类图:
在这里插入图片描述
1)Phone组合了Brand,这样不同手机类型则有组合了不同的手机品牌
2)在调用的时候我们调用手机样式的方法就会通过调用组合的手机品牌调用手机品牌的方法

代码示例

手机品牌类

public interface Brand {void call();void close();void open();
}

手机样式,组合了手机品牌,不同方法都是调用手机品牌的方法

public abstract class Phone {private Brand brand;public Phone(Brand brand) {this.brand = brand;}protected void open() {brand.open();}protected void close() {brand.close();}protected void call() {brand.call();}
}

小米手机和Vivo手机

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

折叠样式的手机

public class FoldedPhone extends Phone{public FoldedPhone(Brand brand) {super(brand);}@Overrideprotected void open() {super.open();System.out.println("折叠样式手机开机");}@Overrideprotected void close() {super.close();System.out.println("折叠样式手机关机");}@Overrideprotected void call() {super.call();System.out.println("折叠样式手机打电话");}
}

创建不同的手机

public class Client {public static void main(String[] args) {// 获取折叠式手机 (样式+品牌)FoldedPhone foldedPhone = new FoldedPhone(new XiaoMi());foldedPhone.open();foldedPhone.call();foldedPhone.close();FoldedPhone foldedPhone1 = new FoldedPhone(new Vivo());foldedPhone1.open();foldedPhone1.call();foldedPhone1.close();}
}

执行结果:
在这里插入图片描述

注意事项和细节

1)实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
2)对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
3)桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
4)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
5)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。


http://www.ppmy.cn/news/99330.html

相关文章

Linux:/dev/tty、/dev/tty0 和 /dev/console 之间的区别

在Linux操作系统中,/dev/tty、/dev/tty0和/dev/console是三个特殊的设备文件,它们在终端控制和输入/输出过程中扮演着重要的角色。尽管它们看起来很相似,但实际上它们之间存在一些重要的区别。本文将详细介绍这三个设备文件之间的区别以及它们…

【Spring框架全系列】第一个Spring程序

🏙哈喽,大家好,我是小浪。那么从今天开始,我就要开始更新spring框架全系列的博客了;本专栏免费阅读,最好能够点个订阅,以便于后续及时收到更新信息哈!🏟 📲目…

ChatGPT 在自动化测试领域的应用,我们真的要被代替了吗?

目录 前言 一、ChatGPT 简介 二、ChatGPT 的应用场景 三、ChatGPT 的优势 四、ChatGPT 的局限性 五、ChatGPT 在自动化测试领域的拓展应用 六、ChatGPT真的可以代替软件测试人员吗 七、结语 前言 人工智能技术在近年来得到了快速发展,不少领域都开始尝试融合…

进程间通信之信号量

进程间通信之信号量 1. 问题2. 什么是信号量(考点,重点关注)3. 信号量的使用4. 实例1. 问题 程序中,有时存在一种特殊代码,最多只允许一个进程执行该部分代码。 这部分区域,称为“临界区”. 然而在多进程并发执行时,当一个进程进入临界区,因某种原因被挂起时,其他进程就…

(可直接使用)在线语音识别APP+阿里云平台+Android Studio 开发项目

目录 所以需要下载软件 (1)Android Studio (2)夜神模拟器 1:在阿里云平台中,登录账号,选择控制台,搜索 智能语音交互 2:智能语音交互 界面 3:创建项目 4:选择项目类别 可以选择 语音识别语…

C++ priority_queue

C priority_queue 📟作者主页:慢热的陕西人 🌴专栏链接:C 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了优先队列的对应接口的使用 文章目录…

云服务器和专用服务器之间的区别

在当今数字化时代,服务器是构建和支持各种应用和服务的基础设施之一。随着技术的发展和需求的增加,出现了不同类型的服务器,其中最常见的是云服务器和专用服务器。本文将详细介绍云服务器和专用服务器之间的区别,以帮助您更好地了…

分布式网络通信框架(九)——RpcChannel调用过程

介绍 客户端使用RpcChannel对象来构造UserServiceRpc_Stub对象&#xff0c;并利用该对象中RpcChannel::CallMethod来进行rpc调用请求,RpcChannel完成的工作是如下rpc调用流程图的红圈部分&#xff1a; 客户端使用mprpc框架的业务代码 // calluserservice.cc #include <ios…