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

23种设计模式之桥接模式

桥接模式

1、定义

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能独立变化

2、桥接模式结构

  • Abstraction(抽象类):它是用于定义抽象类的,通常是抽象类而不是接口,其中定义了一个Implementor类型的对象并可以维护该对象,它与Implementor之间具有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法
  • RefinedAbstraction(扩充抽象类):扩充Abstraction,通常情况下它不再是抽象类而是具体类,在RefinedAbstraction中可以调用在Implementor中定义的业务方法
  • Implementor(实现类接口):它是定义实现类的接口,这个接口不一定要与Abstraction完全一致,事实上两个接口可以完全不同。一般而言,Implementor仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系
  • ConcreteImplementor(具体实现类):它实现了Implementor接口

在这里插入图片描述

3、示例

Abstraction 创建Person抽象类

public abstract class Person {private Clothing clothing;private String type;public Clothing getClothing() {return clothing;}public void setClothing(Clothing clothing) {this.clothing = clothing;}public void setType(String type) {this.type = type;}public String getType() {return this.type;}public abstract void dress();
}

RefinedAbstraction 创建Man、Lady类

public class Man extends Person{public Man() {setType("男人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}
public class Lady extends Person {public Lady() {setType("女人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}

Implementor 创建Clothing抽象类

public abstract class Clothing {public abstract void personDressCloth(Person person);
}

ConcreteImplementor 创建Jacket、Pants类

public class Jacket extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿马甲");}
}
public class Pants extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿裤子");}
}

测试类

public class Client {public static void main(String[] args) {Person man = new Man();Person lady = new Lady();Clothing jacket = new Jacket();Clothing pants = new Pants();jacket.personDressCloth(man);pants.personDressCloth(man);jacket.personDressCloth(lady);pants.personDressCloth(lady);}
}

输出结果

男人穿马甲
男人穿裤子
女人穿马甲
女人穿裤子

4、桥接模式优缺点

4.1优点
  • 分离抽象接口及其实现部分。使用对象间的关联关系解耦了抽象和现实之间固有的绑定关系,使抽象和实现可以沿着各自的维度来变化
  • 桥接模式在有些情况下可以取代多层继承方案,极大减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有系统,符合开闭原则
4.2缺点
  • 增加系统的理解与设计难度,关联关系建立在抽象层
  • 要求正确的识别出系统中的两个独立变化的维度,因此其适用范围具有一定的局限性

5、桥接模式的适用环境

1.不需要在抽象和它的实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分程序可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。 这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对其他业务不产生影响,即其他业务的代码不必重新编译。

4.需要在多个对象间共享实现(可能使用引用计数),但同时需要对其他业务无感知。

相关文章:

  • 【Unity设计模式】状态编程模式
  • Git与SSH
  • 深入了解软件设计模式:创新应用与优化代码结构
  • 【信息学奥赛】CSP-J/S初赛04 进制转换相关问题(二、八、十六进制与十进制互相转换)
  • leetcode67 二进制求和
  • Android低代码开发 - InputMenuPanelItem详解
  • 2.spring cloud gateway 源码编译
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • 表 达式树
  • 【NCBI】SRA toolkit安装及使用-WindowsLinux版本
  • 摄像头劫持——保护自己免受窥探
  • 【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践
  • 6.2 事件的创建,修改和删除
  • React native新架构组成
  • SQL server with方法修改
  • Git同步原始仓库到Fork仓库中
  • Java到底能干嘛?
  • java取消线程实例
  • Material Design
  • PAT A1050
  • SpringBoot几种定时任务的实现方式
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 大数据与云计算学习:数据分析(二)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 检测对象或数组
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 主流的CSS水平和垂直居中技术大全
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​Java基础复习笔记 第16章:网络编程
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2)空速传感器
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (学习日记)2024.02.29:UCOSIII第二节
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)甲方乙方——赵民谈找工作
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Project Open Day(2011.11.13)
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @ConfigurationProperties注解对数据的自动封装
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解
  • [Android]一个简单使用Handler做Timer的例子
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++]18:set和map的使用
  • [C++]priority_queue的介绍及模拟实现
  • [codeforces] 25E Test || hash
  • [HJ56 完全数计算]
  • [Leetcode] 寻找数组的中心索引
  • [LeetCode]Max Points on a Line
  • [Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例
  • [mongodb][配置]MongoDB中限制内存