Go和Java实现桥接模式

Go和Java实现桥接模式

我们下面通过跨平台(Windows、Mac 和 Linux)播放不同格式的视频文件(mpeg、rmvb、avi 和 wmv)来说明桥接

模式的使用。

1、桥接模式

桥接是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽

象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互

不影响。

桥接模式的目的是将抽象与实现分离,使它们可以独立地变化,该模式通过将一个对象的抽象部分与它的实现部分

分离,使它们可以独立地改变。它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。

  • 意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

  • 主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

  • 何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

  • 如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

  • 关键代码:抽象类依赖实现类。

  • 应用实例:1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,

    前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选

    择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

  • 优点:1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

  • 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象

    进行设计与编程。

  • 使用场景:1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次

    之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继

    承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的

    维度,且这两个维度都需要进行扩展。

  • 注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

  • 以下是桥接模式的几个关键角色:

    抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。

    扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。

    实现(Implementor):定义实现接口,提供基本操作的接口。

    具体实现(Concrete Implementor):实现实现接口的具体类。

  • 适用性:

    你不希望在抽象和它的实现部分之间有一个固定的绑定关系,例如这种情况可能是因为,在程序运行时刻实现

    部分应可以进行选择或者切换。

    类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充,这时 Bridge 模式使你可以对不同的抽象接

    口和实现部分进行组合,并分别对它们进行扩充。

    对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

    如果有许多类要生成,你必须将一个对象分解成两个部分。

    设想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

2、Go实现桥接模式

package bridge// ==========Video==========
type Video interface {Format()
}
package bridgeimport "fmt"// ==========Avi==========
type Avi struct {
}func (avi *Avi) Format() {fmt.Println("avi format!")
}
package bridgeimport "fmt"// ==========Mpeg==========
type Mpeg struct {
}func (mpeg *Mpeg) Format() {fmt.Println("mpeg format!")
}
package bridgeimport "fmt"// ==========Rmvb==========
type Rmvb struct {
}func (rmvb *Rmvb) Format() {fmt.Println("rmvb format!")
}
package bridgeimport "fmt"// ==========Wmv==========
type Wmv struct {
}func (wmv *Wmv) Format() {fmt.Println("wmv format!")
}
package bridge// ==========Platform==========
type Platform interface {Play()
}
package bridgeimport "fmt"// ==========Linux==========
type Linux struct {Video
}func (linux *Linux) Play() {fmt.Println("linux platform play:")linux.Video.Format()
}
package bridgeimport "fmt"// ==========Windows==========
type Windows struct {Video
}func (windows *Windows) Play() {fmt.Println("windows platform play:")windows.Video.Format()
}
package bridgeimport "fmt"// ==========Mac==========
type Mac struct {Video
}func (mac *Mac) Play() {fmt.Println("mac platform play:")mac.Video.Format()
}
package mainimport . "proj/bridge"func main() {// ==========Windows=======// ==========Mpeg==========winMpeg := &Windows{Video: &Mpeg{}}winMpeg.Play()// ==========Linux========// ==========Wmv==========linuxWmv := &Linux{Video: &Wmv{}}linuxWmv.Play()// ==========Mac==========// ==========Avi==========macAvi := &Mac{Video: &Avi{}}macAvi.Play()
}
# 输出
windows platform play:
mpeg format!
linux platform play:
wmv format!
mac platform play:
avi format!

3、Java实现桥接模式

package com.bridge;// ==========Video==========
public interface Video {void format();
}
package com.bridge;// ==========Avi==========
public class Avi implements Video{@Overridepublic void format() {System.out.println("avi format!");}
}
package com.bridge;// ==========Mpeg==========
public class Mpeg implements Video{@Overridepublic void format() {System.out.println("mpeg format!");}
}
package com.bridge;// ==========Rmvb==========
public class Rmvb implements Video{@Overridepublic void format() {System.out.println("rmvb format!");}
}
package com.bridge;// ==========Wmv==========
public class Wmv implements Video{@Overridepublic void format() {System.out.println("wmv format!");}
}
package com.bridge;// ==========Platform==========
public abstract class Platform {Video video;abstract void play();
}
package com.bridge;// ==========Linux==========
public class Linux extends Platform{public Linux(Video video){this.video = video;}@Overridepublic void play() {System.out.println("linux platform play:");this.video.format();}
}
package com.bridge;// ==========Mac==========
public class Mac extends Platform {public Mac(Video video){this.video = video;}@Overridepublic void play() {System.out.println("mac platform play:");this.video.format();}
}
package com.bridge;// ==========Windows==========
public class Windows extends Platform{public Windows(Video video){this.video = video;}@Overridepublic void play() {System.out.println("windows platform play:");this.video.format();}
}
package com.bridge;public class Test {public static void main(String[] args) {// ==========Windows==========// ==========Mpeg=============Platform winMpeg = new Windows(new Mpeg());winMpeg.play();// ==========Linux==========// ==========Wmv=============Platform linuxWmv = new Linux(new Wmv());linuxWmv.play();// ==========Mac==========// ==========Avi==========Mac macAvi = new Mac(new Avi());macAvi.play();}
}
# 输出
windows platform play:
mpeg format!
linux platform play:
wmv format!
mac platform play:
avi format!

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

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

相关文章

Communications link failure

异常信息: org.springframework.orm.jpa.JpaSystemException: Unable to commit against JDBC Connection; nested exception is org.hibernate.TransactionException: Unable to commit against JDBC Connectionat org.springframework.orm.jpa.vendor.Hibernate…

android 测试设备以太网口的黄绿灯

需求:测试android 设备以太网口的黄灯和绿灯是否正常 ThreadUtils.runOnSubThread(new Runnable() { Override public void run() { Log.d("coco","test network 1000m start."); LinuxCommandRunner.exec("su"); LinuxCommandRunner…

【JavaScript 】深入理解浏览器本地存储

简介 Web本地存储是一种在浏览器中存储数据的机制,允许开发者在客户端存储和检索数据。本教程将详细介绍Web本地存储的不同技术和方法,包括LocalStorage和SessionStorage。 LocalStorage 存储数据 LocalStorage是一种在浏览器中存储数据的API,可以将键值对保存到客户端浏览…

11.物联网操作系统内存管理

一。STM32编译过程及程序组成 STM32编译过程 程序的组成、存储与运行 MDK生成的主要文件分析 1.STM32编译过程 1.源文件(Source code)--》目标文件(Object code) .c(C语言)通过armcc生成.o,.s(汇编&…

gdb学习笔记

参考:https://blog.csdn.net/Stars_WW/article/details/88994391 gdb常用交互命令 启动gdb后,进入到交互模式,通过以下命令完成对程序的调试;注意高频使用的命令一般都会有缩写,熟练使用这些缩写命令能提高调试的效率;…

ELD透明屏在智能家居中有哪些优点展示?

ELD透明屏是一种新型的显示技术,它能够在不需要背光的情况下显示图像和文字。 ELD透明屏的原理是利用电致发光效应,通过在透明基板上涂覆一层特殊的发光材料,当电流通过时,发光材料会发出光线,从而实现显示效果。 ELD…

Android 从LibVLC-android到自编译ijkplayer播放H265 RTSP

概述 ijkplayer: Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support. 官方的描述就这么简单的一句话,但丝毫都不影响它的强大。 从LibVLC 到 ijkplayer 截止到2023.7.20 LibVLC-Android 最大的问题在与OOM,测试了…

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…

【JAVA】类和对象

作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型,艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

HTML|计算机网络相关

1.三次握手 第一次握手:客户端首先向服务端发送请求。 第二次握手:服务端在接收到客户端发送的请求之后,需要告诉客户端已收到请求。 第三次握手:客户端在接收到服务端发送的请求和确认信息之后,同样需要告诉服务端已…

Maven设置阿里云路径(防止加载过慢)

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …

OpenCV图像处理技巧之空间滤波

1. 引言 再次问好&#xff0c;图像处理爱好者们&#xff01;&#x1f31f; 在前面的章节中&#xff0c;我们学习了图像处理的基础知识&#xff0c;并展现了图像增强的魅力。在这一节中&#xff0c;我们将更深入地研究空间滤波技术。 闲话少说&#xff0c;我们直接开始吧&#…

设计模式--策略模式(由简单工厂到策略模式到两者结合图文详解+总结提升)

目录 概述概念组成应用场景注意事项类图 衍化过程需求简单工厂实现图代码 策略模式图代码 策略模式简单工厂图代码 总结升华版本迭代的优化点及意义什么样的思路进行衍化的扩展思考--如何理解策略与算法 概述 概念 策略模式是一种行为型设计模式&#xff0c;它定义了算法家族&…

【LeetCode】094. 分割回文串II

文章目录 1. 解题思路1.1 创建dp表1.2 状态转移方程1.3 提前求出所有子串是否是回文串 2. 整体代码 1. 解题思路 1.1 创建dp表 这道题我们使用动态规划的方法来解&#xff0c;首先创建一个大小为字符串长度的dp表。dp[i] 表示 s[0, i] 的字符串最小划分多少次可以全划分为回文…

Vue的路由守卫

文章目录 一、全局守卫1. beforeEach2. beforeResolve3. afterEach 二、路由守卫1. beforeEnter 三、组件守卫1. beforeRouteEnter2. beforeRouteUpdate3. beforeRouteLeave 四、总结 一、全局守卫 顾名思义&#xff0c;是要定义在全局的&#xff0c;也就是我们 index.js 中的…

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图&#xff1a; 弹框信息&#xff1a; Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…

网络:从socket编程的角度说明UDP和TCP的关系,http和tcp的区别

尝试从编程的角度解释各种网络协议。 UDP和TCP的关系 从Python的socket编程角度出发&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是两种不同的传输协议。 TCP是一种面向连接的协议&#xff0c…

.net core 依赖注入生命周期

在.NET Core中&#xff0c;依赖注入的生命周期用于控制注入的服务实例的生命周期。下面是.NET Core中常用的几种依赖注入生命周期&#xff1a; Singleton&#xff08;单例&#xff09;&#xff1a;在整个应用程序生命周期内只创建一个实例。每次注入都返回同一个实例。示例代码…

实数信号的傅里叶级数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…