java设计模式-桥接模式

一. 概述

        桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。桥接模式主要目的是解决当一个类存在多个继承等级时,由于继承带来的耦合问题,以及扩展性不足的问题。

  • 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承
  • 类型:结构性。

二. 使用场景

  1. 抽象和具体实现之间增加更多的灵活性
  2. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
  3. 不希望使用继承,或因为多层继承导致系统类的个数剧增

 三. 桥接模式的原理及代码示例

1. 桥接模式的组成部分:

  1. 抽象化(Abstraction)角色 :主要负责定义出该角色的行为 ,并包含一个对实现化对象的引用。
  2. 扩展抽象化(RefinedAbstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色 :定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

2. UML图

3. 桥接模式具体实现步骤:

  1. 定义实手机接口
  2. 实现手机接口(不同的品牌添加不同的实现类)
  3. 定义抽象类(通过这个抽象类实现抽象和具体实现分离)
  4. 实现抽象类。
  5. 在扩展抽象化角色中,组合实现化角色的实例,并实现具体的行为。

4. 示例代码

        代码示例以手机和产地为例,手机分为国产品牌和美国品牌,国产手机可分为华为,vivo等,美国有苹果手机,谷歌手机等,对国产手机的添加只需添加一个具体实现类即可,如果想要添加一个韩国的手机则需要对抽象类进行继承实现。

  • 1. 定义接口
package com.seata;
/*** 文件名:dnm* 创建者:* 创建时间:* 描述:手机品牌接口*/
public interface IMobilePhoneInterface {void showMobilePhone();
}
  • 2. 实现类(华为手机)
package com.seata;/*** 文件名:HuaWeiMobilePhone* 创建者:* 创建时间:* 描述:华为品牌手机*/
public class HuaWeiMobilePhone implements IMobilePhoneInterface{@Overridepublic void showMobilePhone() {System.out.println("华为手机");}
}
  • 3. 实现类(苹果手机)
package com.seata;/*** 文件名:AmericaMobilePhone* 创建者:* 创建时间:* 描述:苹果手机*/
public class AppleMobilePhone implements IMobilePhoneInterface{@Overridepublic void showMobilePhone() {System.out.println("苹果手机");}
}
  • 4. 定义抽象类
package com.seata;/*** 文件名:CountryAbstract* 创建者:* 创建时间:* 描述:抽象类*/
public abstract class CountryAbstract {// 持有接口属性protected IMobilePhoneInterface phoneInterface;public CountryAbstract(IMobilePhoneInterface phoneInterface){this.phoneInterface = phoneInterface;}abstract void showCountry();}
  • 5. 国产品牌
package com.seata;/*** 文件名:China* 创建者:* 创建时间:* 描述:国产品牌*/
public class China extends CountryAbstract{public China(IMobilePhoneInterface phoneInterface){super(phoneInterface);}@Overridevoid showCountry() {phoneInterface.showMobilePhone();System.out.println("国产品牌");}
}
  • 6. 美国品牌
package com.seata;/*** 文件名:America* 创建者:* 创建时间:* 描述:美国品牌*/
public class America extends CountryAbstract{public America(IMobilePhoneInterface phoneInterface){super(phoneInterface);}@Overridevoid showCountry() {phoneInterface.showMobilePhone();System.out.println("美国品牌");}
}
  • 7. 测试类
package com.seata;/*** 文件名:Test* 创建者:* 创建时间:* 描述:  测试类*/
public class Test {public static void main(String[] args) {//国产品牌China countryAbstract = new China(new HuaWeiMobilePhone());countryAbstract.showCountry();System.out.println("=======================================");//美国品牌America anAbstract = new America(new AppleMobilePhone());anAbstract.showCountry();}
}

 测试结果

  • 8. 假如我们想要添加一个国产 vivo 手机,只需要在添加一个实现类即可
package com.seata;/*** 文件名:VivoMobilePhone* 创建者:* 创建时间:* 描述:vivo手机*/
public class VivoMobilePhone implements IMobilePhoneInterface{@Overridepublic void showMobilePhone() {System.out.println("vivo 手机");}
}

测试类添加

package com.seata;/*** 文件名:Test* 创建者:* 创建时间:* 描述:  测试类*/
public class Test {public static void main(String[] args) {//国产品牌China countryAbstract = new China(new HuaWeiMobilePhone());countryAbstract.showCountry();System.out.println("=======================================");//美国品牌America anAbstract = new America(new AppleMobilePhone());anAbstract.showCountry();System.out.println("=======================================");//Vivo品牌China china = new China(new VivoMobilePhone());china.showCountry();}
}

测试结果

  • 9.假如我们想要添加一个韩国的三星品牌手机,这个时候需要添加抽象类的实现类,再添加一个具体实现类

添加抽象类的实现类

package com.seata;/*** 文件名:BnagZiMobilePhone* 创建者:* 创建时间:* 描述:韩国*/
public class BnagZi extends CountryAbstract{public BnagZi(IMobilePhoneInterface phoneInterface){super(phoneInterface);}@Overridevoid showCountry() {phoneInterface.showMobilePhone();System.out.println("韩国品牌");}
}

添加手机品牌具体实现类

package com.seata;/*** 文件名:BnagZiMobilePhone* 创建者:* 创建时间:* 描述:三星手机*/
public class SanXingMobilePhone implements IMobilePhoneInterface{@Overridepublic void showMobilePhone() {System.out.println("三星手机");}
}

测试类

package com.seata;/*** 文件名:Test* 创建者:* 创建时间:* 描述:  测试类*/
public class Test {public static void main(String[] args) {//国产品牌China countryAbstract = new China(new HuaWeiMobilePhone());countryAbstract.showCountry();System.out.println("=======================================");//美国品牌America anAbstract = new America(new AppleMobilePhone());anAbstract.showCountry();System.out.println("=======================================");//Vivo品牌China china = new China(new VivoMobilePhone());china.showCountry();System.out.println("=======================================");//三星品牌BnagZi bnagZi = new BnagZi(new SanXingMobilePhone());bnagZi.showCountry();}
}

测试结果

四. 桥接模式的优缺点

优点:

  1. 分离抽象部分及其具体实现部分,解耦抽象与实现的绑定关系
  2. 提高了系统的可扩展性
  3. 符合开闭原则
  4. 符合合成复用原则

缺点:

  1. 增加了系统的理解与设计难度
  2. 需要正确的识别出系统中两个独立变化的维度

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

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

相关文章

计算机网络408考研 2015

计算机网络408考研2015年真题解析_哔哩哔哩_bilibili 1 1线路编码(NRZ,NRZI,8B/10B,Manchester)与加扰_nrz编码-CSDN博客 1 1 11

19c做好这件事,大幅提升Data Pump工作效率

老司机遇到的新问题 expdp是Oracle 10g引入的数据导出工具,能够提供并行、压缩及元数据导出等更多的功能,在后续的版本中逐渐替代了传统的数据导出工具exp,是数据库开发运维常用的工具之一。在我的印象中,这个工具除了诸如大量的…

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者:移动通信集团河北有限公司架构规划专家,房瑞 项目背景: 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召,以磐舟&磐基云原生为底座,结合国产浏览器、中间件、数据库、操作系统和服务器等&a…

Jupyter Notebook介绍、安装及使用教程

文章目录 一.什么是Jupyter Notebook?1.Jupyter Notebok简介2.组成部分3.Jupyter Notebook的主要特点 二.安装Jupyter Notebook0.先试用再决定1.安装①安装前提②使用Anaconda安装③使用pip命令安装 三.运行Jupyter Notebook0.帮助1.启动①默认端口启动②指定端口启…

零基础学会机器学习,到底要多久?

这两天啊,有不少朋友和我说,想学机器学习,但是之前没有基础,不知道能不能学得会。 首先说结论,只要坚持,就能学会,但是一定不能三天打鱼两天晒网,要持之以恒,至少每隔两…

自由职业四年,我整理了一些建议

我是勋荣,一个独立开发者。运营了自己的社群,有自己的软件产品。目前还在探索各种副业的路上~ 1我的独立开发之路 刚毕业就找不到Android岗位的我瑟瑟发抖。在广州,稀里糊涂做了Java后端开发。有一天加班 通宵,早上借住在同事家…

Python教程(十三):常用内置模块详解

目录 专栏列表1. os 模块2. sys 模块3. re 模块4. json 模块5. datetime 模块6. math 模块7. random 模块8. collections 模块9. itertools 模块10. threading 模块11. 加密 模块 总结 专栏列表 Python教程(十):面向对象编程(OOP…

【MySQL】什么是索引?了解索引的底层原理

索引的概念 索引是一种用于提高数据库查询效率的数据结构。它类似于书籍的目录,通过快速定位数据的方式,减少了数据检索的时间。索引在数据库表中可以被看作是一个指向数据的指针,它们存储了列的值及其对应行的位置,从而使得数据…

Java面试八股之消息队列有哪些协议?各种协议有哪些具体实现

消息队列有哪些协议?各种协议有哪些具体实现 消息队列协议是指在消息队列系统中,用于消息的发送、接收和管理的一套通信规则。不同的协议有着不同的特性和应用场景,以下是一些常见的消息队列协议及其具体实现: AMQP (Advanced M…

某通用系统0day审计过程

前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK&…

mfc140.dll丢失如何修复,一步步教你如何解决mfc140.dll丢失,让电脑快速恢复正常状态!

mfc140.dll是 Microsoft Foundation Class (MFC) Library 的一部分,它是一个用于开发 Windows 应用程序的 C 库。当系统报告mfc140.dll丢失时,通常意味着某个应用程序需要这个 DLL 文件来运行,但系统中没有找到它。那么mfc140.dll丢失如何修复…

jetson nano远程调试说明

Jetson nano官方演示不仅需要网线、显示屏、Jetson nano开发板、HDMI线、5V的电源适配器,还需要USB键盘和USB鼠标,携带不方便。这里简单整理下可以不用使用USB键盘、USB鼠标和网线也可以演示。 硬件准备 一块 Jetson Nano ALT 开发板;一个 5…

WordPress原创插件:Download-block-plugin下载按钮图标美化

WordPress原创插件:Download-block-plugin下载按钮图标美化 https://download.csdn.net/download/huayula/89632743

Apache Tomcat服务器版本号隐藏

渗透测试时发现有一台服务器的404报错页面中,有Apache Tomcat的版本号信息显示,发生了信息泄露,可能导致服务器被攻击。如下所示: 解决步骤如下: 1. 隐藏HTTP响应头中的Server信息 Tomcat默认会在HTTP响应头中包含S…

最后一公里!观测云如何重塑北欧城市交通

在北欧地区,共享滑板车已经超越了简单的交通工具,它不仅成为了解决最后一公里出行的首选,更象征着一种全新城市生活方式的兴起。这种生活方式不仅体现了北欧地区对环保、便捷和创新的不懈追求,也彰显了其对提高生活质量的持续努力…

IDEA:Dangling Javadoc comment

JetBrains对JavaDocs的描述: Javadoc comments are usually placed above classes, methods, or fields in your source code. A Javadoc provides a description of the code element located under it and contains block tags marked with with specific metada…

haproxy 7000字配图超详细教程 从小白到入门

简介:HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速,HAProxy具备媲美商用负载均衡器的性能和稳…

LVS中NAT模式和DR模式实战讲解

1DR模式 DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT&#xf…

开源工具提升你的生产力

如果你想摆脱大科技公司的专有控制,有一些选择是很好的。 每一个阴都有一个阳;每一个动作都有一个反作用力;每一个专有软件都有一个开源替代品。大概就是这样的。 在过去的几年里,技术中的“开放性”问题在公众意识中从未如此突出…

【网络编程】字节序,IP地址、点分十进制、TCP与UDP的异同

记录学习,思维导图绘制 目录 1、字节序​编辑 2、IP地址 3、点分十进制 4、TCP与UDP的异同 1、字节序 2、IP地址 3、点分十进制 4、TCP与UDP的异同