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

目录

    • 一、简介
    • 二、桥接模式
      • 2.1、手机品牌接口
      • 2.2、手机功能接口
      • 2.3、抽象部分
      • 2.4、具体抽象部分
      • 2.5、使用
    • 三、优点和缺点

一、简介

   桥接模式(Bridge Pattern) 是一种结构型设计模式,用于将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式的核心思想是将一个大类或一系列紧密相关的类拆分成两个独立的层次结构:抽象部分(Abstraction)和实现部分(Implementation),使它们能够独立地进行变化。

  在桥接模式中,抽象部分定义了客户端使用的高层接口,而实现部分则是实现这些接口的具体实现类。抽象部分和实现部分各自通过接口进行通信,而不是通过继承的方式,这样就可以在运行时动态地将抽象部分和实现部分组合起来。

  通过桥接模式,可以更容易地对系统进行扩展和维护,因为抽象部分和实现部分可以独立地变化,而且它们的变化不会相互影响。总的来说,桥接模式主要用于解耦抽象部分和实现部分,以提高代码的灵活性、可扩展性和可维护性。以下是桥接模式的几个关键角色:

  • 抽象(Abstraction) :定义抽象接口,通常包含对实现接口的引用。
  • 扩展抽象(Refined Abstraction) :对抽象的扩展,可以是抽象类的子类或具体实现类。
  • 实现(Implementor) :定义实现接口,提供基本操作的接口。
  • 具体实现(Concrete Implementor) :实现实现接口的具体类。

二、桥接模式

2.1、手机品牌接口

  定义一个品牌的接口,这里有两个品牌的实现类,苹果和华为。

// 实现部分:手机品牌接口
public interface Brand {String info();
}// 具体实现部分:苹果品牌
public class Apple implements Brand {public String info() {return "苹果";}
}// 具体实现部分:华为品牌
public class Huawei implements Brand {public String info() {return "华为";}
}

2.2、手机功能接口

  定义一个手机的功能的接口,同时有两个功能实现如照相和打游戏。

// 具体实现部分:手机功能接口
public interface PhoneFunction {String feature();
}// 具体实现部分:拍照功能
public class Camera implements PhoneFunction {public String feature() {return "照相";}
}// 具体实现部分:游戏功能
public class Gaming implements PhoneFunction {public String feature() {return "打游戏";}
}

2.3、抽象部分

  定义抽象部分,它包括对品牌接口和功能接口的引用。

// 抽象部分:手机抽象类
public abstract class Phone {protected Brand brand;protected PhoneFunction function;public Phone(Brand brand, PhoneFunction function) {this.brand = brand;this.function = function;}abstract String showInfo();
}

2.4、具体抽象部分

  对抽象部分的实现

// 具体抽象部分:具体手机类
public class ConcretePhone extends Phone {public ConcretePhone(Brand brand, PhoneFunction function) {super(brand, function);}public String showInfo() {return brand.info() + function.feature();}
}

2.5、使用

public class BridgePatternDemo {public static void main(String[] args) {// 组装不同品牌的手机和不同功能System.out.println(new ConcretePhone(new Apple(), new Camera()).showInfo());System.out.println(new ConcretePhone(new Apple(), new Gaming()).showInfo());System.out.println(new ConcretePhone(new Huawei(), new Camera()).showInfo());System.out.println(new ConcretePhone(new Huawei(), new Gaming()).showInfo());}
}

运行结果:

苹果照相
苹果打游戏
华为照相
华为打游戏

  这个例子中,手机品牌和手机功能被解耦合,使得我们可以轻松地组合不同的品牌和功能,而不需要修改具体手机类。这展示了桥接模式的核心思想:将抽象部分与实现部分分离,使得它们可以独立地变化和扩展。

三、优点和缺点

  桥接模式的优点和缺点如下:

优点:

  • 解耦合: 桥接模式可以将抽象部分和实现部分分离,使它们可以独立变化,降低它们之间的耦合性。
  • 扩展性: 桥接模式可以方便地扩展和增加新的抽象部分和实现部分,而不会相互影响,系统更加灵活。
  • 可维护性: 分离抽象和实现部分使得代码更加清晰、易于理解和维护。
  • 隐藏实现细节: 客户端仅与抽象部分进行交互,隐藏了实现的细节,使得系统更加简洁、易于使用。

缺点:

  • 增加复杂性: 桥接模式需要对系统进行额外的抽象,可能增加系统的复杂性,特别是在具有多层次抽象的情况下。
  • 设计较难: 桥接模式需要设计抽象部分和实现部分之间的接口和关联关系,需要一定的设计能力和经验。
  • 可能导致过多的类: 如果应用桥接模式过度,系统中可能会产生大量的类,增加系统的管理和维护难度。

  总体来说,桥接模式可以提高系统的灵活性和可扩展性,使得抽象部分和实现部分可以独立地变化和扩展,但需要在设计时权衡好系统的复杂性和可维护性。

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

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

相关文章

【算法题】96. 不同的二叉搜索树

题目 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5 示例 2: 输入:n 1 输出&#x…

js逆向-某东验证码逆向分析

声明 本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负! 如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦! 插句个人内容:本人最近正在找工作,工作城…

MySQL数据库常用语法回顾及知识点合集(持续更新中……)

前言 本文适合有一定基础的进行快速简单回顾复习。 对于现如今的无论哪一类软件或应用,都几乎无法离开数据库,常见使用的关系性数据库如MySQL、Oracle,非关系性数据库如MongoDB、Redis等。而MySQL数据库则是软件开发中最常用的数据库之一&…

基于SpringBoot的美妆管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

CS50x 2024 - Lecture 1 - C

本周学习C语言,重点是函数、变量、条件语句和循环。 05:11介绍了编程语言的转换过程,从源代码到机器码,以及编译器的作用。 编译器是将一种语言翻译成另一种语言的程序 09:18使用CS50.dev进行编程,介绍了VS Code和命令行界面的…

LeetCode Python - 1.两数之和

文章目录 题目答案运行结果 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能…

数据结构——算法的时间复杂度和空间复杂度

1、算法效率 1.1如何衡量一个算法的好坏&#xff1f; 比如我们最熟悉的斐波那契数列 long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 上面的斐波那契数列使用递归实现&#xff0c;看起来非常的简洁&#xff0c;那么代码一定是越简洁越好么&…

930. 和相同的二元子数组(多指针滑动窗口)

多指针滑动窗口 滑动窗口&#xff0c;由于题目中数组为二元组数组&#xff0c;对于每一个数组下标 j &#xff0c;当其满足 preSum[j]−preSum[i]goal的条件时&#xff0c;对应 i为一个连续区间&#xff0c;若能够求得 i 的左右边界 left1 与 left2&#xff0c;则此时共有 left…

对接社群团购的风险和坑,其实只有两点

社群团购对接合作的风险和坑&#xff0c;其实只有两点。 让大家更好地了解微信群团购&#xff08;社群团购&#xff09;&#xff0c;正确进入这个领域&#xff0c;借助社群团购进行创业以及货源方通过这个销售渠道进行产品销售。我们将行业的几个关键点进行总结分享&#xff0c…

MongoDB聚合: $skip

$skip聚合阶段用于跳过指定数量的输入文档&#xff0c;并将剩余文档传递到流水线的下一个阶段。 语法 { $skip: <positive 64-bit integer> }使用 $skip需要指定一个正整数来决定跳过的文档数量。从5.0开始&#xff0c;$skip阶段跳过文档的数量限制为一个64位的整数&a…

力扣15-三数之和

三数之和 题目链接 解题思路 1、枚举每个数&#xff0c;表示该数nums[i]已被确定&#xff0c;在排序后的情况下&#xff0c;通过双指针l&#xff0c;r分别从左边l i 1和右边n - 1往中间靠拢&#xff0c;找到nums[i] nums[l] nums[r] 0的所有符合条件的搭配 2、在找符合条…

Python CSV文件读取和写入

本文主要为Python 实现CSV文件读取和写入操作。 CSV文件写入和读取 因为没有现成的csv文件&#xff0c;所以csv的顺序为先写入后读取。 写入 创建csv文件并把数据写入&#xff0c;有两种实现方式&#xff1a;直接插入所有行和插入单行。 示例如下&#xff1a; import csv i…

vim最简单命令学习

安装vim sudo apt install vim在终端随便打开一个文本文件&#xff0c;或者源文件&#xff0c; vim filepath输入该命令后&#xff0c;从终端进入vim编辑器&#xff0c;此时为普通模式(Normal)。 按i键进入编辑模式(Insert)&#xff0c;按Esc键返回普通模式(Normal)。 在编辑…

C语言常见面试题:C语言中如何进行比较运算?

在C语言中&#xff0c;比较运算用于比较两个值的大小关系。比较运算符包括等于&#xff08;&#xff09;、不等于&#xff08;!&#xff09;、大于&#xff08;>&#xff09;、小于&#xff08;<&#xff09;、大于等于&#xff08;>&#xff09;和小于等于&#xff0…

pycharm 配置 conda 新环境

1. conda 创建新环境 本章利用pycharm将conda新建的环境载入进去 关于conda的下载参考上一章博文&#xff1a;深度学习环境配置&#xff1a;Anaconda 安装和 pip 源 首先利用conda 新建虚拟环境 这里按 y 确定 安装好如下&#xff1a;这里两行命令代表怎么激活和关闭新建的虚…

顺序表、链表相关OJ题(2)

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、旋转数组&#xff08;力扣&#xff09; 经典算法OJ题&#xff1a;旋转数组 思路1&#xff1a;每次挪动1位&#xff0c;右旋k次 时间复杂度&#xff1a;o(N^2) 右旋最好情况&#xff1a;k是n的倍数…

Verilog刷题笔记21

题目&#xff1a; A priority encoder is a combinational circuit that, when given an input bit vector, outputs the position of the first 1 bit in the vector. For example, a 8-bit priority encoder given the input 8’b10010000 would output 3’d4, because bit[4…

幻方(Magic Square)

幻方&#xff08;Magic Square&#xff09; 幻方概述 什么是幻方呢&#xff1f;幻方&#xff08;Magic Square&#xff09;就是指在nn&#xff08;n行n列&#xff09;的方格里填上一些连续的数字&#xff0c;使任意一行、任意一列和对角线上的数字的和都相等。例如有33的3行3…

【PyQt】06-.ui文件转.py文件

文章目录 前言方法一、基本脚本查看自己的uic安装目录 方法二、添加到扩展工具里面&#xff08;失败了&#xff09;方法二的成功步骤总结 前言 方法一、基本脚本 将Qt Designer&#xff08;一种图形用户界面设计工具&#xff09;生成的.ui文件转换为Python代码的脚本。 pytho…

win11安装mysql8.3.0压缩包版 240206

mysql社区版安装包版windows安装包下载地址 在系统环境变量path无点.的情况下 powershell 可以 .\ 或 ./ 开头表示当前文件夹cmd 可以直接命令或.\开头, 不能./开头 所以 .\ 在cmd和powershell中通用 步骤 在解压目录 .\mysqld --initialize-insecure root无密码初始化.\m…