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

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

目录

    • 一、简介
    • 二、桥接模式
      • 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());}
}

运行结果:

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

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

三、优点和缺点

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

优点:

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

缺点:

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

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

相关文章:

  • linux的tree用法
  • 【每日一题】LeetCode——反转链表
  • HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础
  • vue绘制语音波形图---wavesurfer.js
  • FPS游戏框架漫谈第二十二天
  • 【go】ent操作之CRUD与联表查询
  • uniapp /微信小程序 使用map组件实现手绘地图方案
  • office文件转pdf在线预览
  • 【前端高频面试题--Vue基础篇】
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力
  • 猫头虎分享已解决Bug || 未定义的变量(Undefined Variable):ReferenceError: x is not defined
  • 获取旁站 / C 段:第三方网站(附链接)
  • 天猫数据分析(天猫数据查询工具):2023年滑雪服市场消费现状及趋势(天猫服饰行业分析报告)
  • php 函数三
  • 新型RedAlert勒索病毒针对VMWare ESXi服务器
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular 4.x 动态创建组件
  • HTTP请求重发
  • input的行数自动增减
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java比较器对数组,集合排序
  • PHP的Ev教程三(Periodic watcher)
  • Quartz初级教程
  • SQLServer之索引简介
  • ubuntu 下nginx安装 并支持https协议
  • webpack+react项目初体验——记录我的webpack环境配置
  • 从零开始在ubuntu上搭建node开发环境
  • 对象管理器(defineProperty)学习笔记
  • 利用DataURL技术在网页上显示图片
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 数据可视化之 Sankey 桑基图的实现
  • 责任链模式的两种实现
  • 进程与线程(三)——进程/线程间通信
  • # 透过事物看本质的能力怎么培养?
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (9)STL算法之逆转旋转
  • (TOJ2804)Even? Odd?
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)fiber的基本认识
  • (六)Hibernate的二级缓存
  • (三)mysql_MYSQL(三)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)scrum常见工具列表
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)一些感悟
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET6 命令行启动及发布单个Exe文件
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)