共享备案网站,织梦 电影网站 模板,分析网站建设前期的seo准备工作,电子商务工资多少钱一个月文章目录 1 桥接模式#xff08;Bridge Pattern#xff09;1.1 介绍1.2 概述1.3 桥接模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二2.1 需求2.1 代码实现 #x1f64a; 前言#xff1a;本文章为瑞_系列专栏之《23种设计模式》的桥接模式篇。本文中的部分图和概念等资料… 文章目录 1 桥接模式Bridge Pattern1.1 介绍1.2 概述1.3 桥接模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二2.1 需求2.1 代码实现 前言本文章为瑞_系列专栏之《23种设计模式》的桥接模式篇。本文中的部分图和概念等资料来源于博主学习设计模式的相关网站《菜鸟教程 | 设计模式》和《黑马程序员Java设计模式详解》特此注明。本文中涉及到的软件设计模式的概念、背景、优点、分类、以及UML图的基本知识和设计模式的6大法则等知识建议阅读 《瑞_23种设计模式_概述》 本系列 - 设计模式 - 链接《瑞_23种设计模式_概述》 ⬇️本系列 - 创建型模式 - 链接 单例模式《瑞_23种设计模式_单例模式》 工厂模式《瑞_23种设计模式_工厂模式》 原型模式《瑞_23种设计模式_原型模式》 抽象工厂模式《瑞_23种设计模式_抽象工厂模式》 建造者模式《瑞_23种设计模式_建造者模式》 ⬇️本系列 - 结构型模式 - 链接 代理模式《瑞_23种设计模式_代理模式》 适配器模式《瑞_23种设计模式_适配器模式》 装饰者模式《瑞_23种设计模式_装饰者模式》 桥接模式《后续更新》 外观模式《后续更新》 组合模式《后续更新》 享元模式《后续更新》 ⬇️本系列 - 行为型模式 - 链接 模板方法模式《后续更新》 策略模式《后续更新》 命令模式《后续更新》 职责链模式《后续更新》 状态模式《后续更新》 观察者模式《后续更新》 中介者模式《后续更新》 迭代器模式《后续更新》 访问者模式《后续更新》 备忘录模式《后续更新》 解释器模式《后续更新》 1 桥接模式Bridge Pattern 桥接Bridge Pattern是用于把抽象化与实现化解耦使得二者可以独立变化。这种类型的设计模式属于结构型模式它是作为现有的类的一个包装它通过提供抽象化和实现化之间的桥接结构来实现二者的解耦。 瑞结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式前者采用继承机制来组织接口和类后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低满足“合成复用原则”所以对象结构型模式比类结构型模式具有更大的灵活性。 这种模式涉及到一个作为桥接的接口使得实体类的功能独立于接口实现类这两种类型的类可被结构化改变而互不影响。 桥接模式的目的是将抽象与实现分离使它们可以独立地变化该模式通过将一个对象的抽象部分与它的实现部分分离使它们可以独立地改变。它通过组合的方式而不是继承的方式将抽象和实现的部分连接起来。
1.1 介绍 意图将抽象部分与实现部分分离使它们都可以独立的变化。 主要解决在有多种可能会变化的情况下用继承会造成类爆炸问题扩展起来不灵活。 何时使用实现系统可能有多个角度分类每一种角度都可能变化。 如何解决把这种多角度分类分离出来让它们独立变化减少它们之间耦合。 关键代码抽象类依赖实现类。 应用实例 1️⃣ 猪八戒从天蓬元帅转世投胎到猪转世投胎的机制将尘世划分为两个等级即灵魂和肉体前者相当于抽象化后者相当于实现化。生灵通过功能的委派调用肉体对象的功能使得生灵可以动态地选择。 2️⃣ 墙上的开关可以看到的开关是抽象的不用管里面具体怎么实现的。 优点 1️⃣ 抽象和实现的分离。 2️⃣ 优秀的扩展能力。 3️⃣ 实现细节对客户透明。 缺点桥接模式的引入会增加系统的理解与设计难度由于聚合关联关系建立在抽象层要求开发者针对抽象进行设计与编程。 使用场景 1️⃣ 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性避免在两个层次之间建立静态的继承联系通过桥接模式可以使它们在抽象层建立一个关联关系。 2️⃣ 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统桥接模式尤为适用。 3️⃣ 一个类存在两个独立变化的维度且这两个维度都需要进行扩展。 注意事项对于两个独立变化的维度使用桥接模式再适合不过了。
1.2 概述 定义将抽象与实现分离使它们可以独立变化。它是用组合关系代替继承关系来实现从而降低了抽象和实现这两个可变维度的耦合度。 现在有一个需求需要创建不同的图形并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系类图如下未使用桥接模式 我们可以发现有很多的类假如我们再增加一个形状或再增加一种颜色就需要创建更多的类。 试想在一个有多种可能会变化的维度的系统中用继承方式会造成类爆炸扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统我们此时可以考虑使用桥接模式。
1.3 桥接模式的结构
桥接Bridge模式包含以下主要角色 1️⃣ 抽象化Abstraction角色 定义抽象类并包含一个对实现化对象的引用。 2️⃣ 扩展抽象化Refined Abstraction角色 是抽象化角色的子类实现父类中的业务方法并通过组合关系调用实现化角色中的业务方法。 3️⃣ 实现化Implementor角色 定义实现化角色的接口供扩展抽象化角色调用。 4️⃣ 具体实现化Concrete Implementor角色 给出实现化角色接口的具体实现。 2 案例一 【案例】视频播放器 2.1 需求 需要开发一个跨平台视频播放器可以在不同操作系统平台如Windows、Mac、Linux等上播放多种格式的视频文件常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度适合使用桥接模式。 类图如下 2.2 代码实现
视频文件接口 /*** 视频文件(实现化角色)** author LiaoYuXing-Ray**/
public interface VideoFile {// 解码功能void decode(String fileName);
}avi视频文件类 /*** avi视频文件具体的实现化角色** author LiaoYuXing-Ray**/
public class AviFile implements VideoFile {Overridepublic void decode(String fileName) {System.out.println(avi视频文件 fileName);}
}rmvb视频文件类 /*** rmvb视频文件具体的实现化角色** author LiaoYuXing-Ray**/
public class RmvbFile implements VideoFile {Overridepublic void decode(String fileName) {System.out.println(rmvb视频文件 fileName);}
}抽象的操作系统类抽象类 /*** 抽象的操作系统类(抽象化角色)** author LiaoYuXing-Ray**/
public abstract class OperatingSystem {// 声明videFile变量protected VideoFile videoFile;public OperatingSystem(VideoFile videoFile) {this.videoFile videoFile;}public abstract void play(String fileName);
}windows操作系统类 /*** 扩展抽象化角色(windows操作系统)** author LiaoYuXing-Ray**/
public class Windows extends OperatingSystem {public Windows(VideoFile videoFile) {super(videoFile);}Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}Mac操作系统类 /*** Mac操作系统(扩展抽象化角色)** author LiaoYuXing-Ray**/
public class Mac extends OperatingSystem {public Mac(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);}
}
类 /*** 测试类** author LiaoYuXing-Ray**/
public class Client {public static void main(String[] args) {// 创建mac系统对象OperatingSystem system new Mac(new AviFile());// 使用操作系统播放视频文件system.play(《源代码》.avi);}
}代码运行结果如下 avi视频文件 《源代码》.avi好处 桥接模式提高了系统的可扩充性在两个变化维度中任意扩展一个维度都不需要修改原有系统。 如如果现在还有一种视频文件类型wmv我们只需要再定义一个类实现VideoFile接口即可其他类不需要发生变化。 实现细节对客户透明
使用场景
当一个类存在两个独立变化的维度且这两个维度都需要进行扩展时。当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系通过桥接模式可以使它们在抽象层建立一个关联关系。 3 案例二 本案例为菜鸟教程中的案例 2.1 需求 使用相同的抽象类方法但是不同的桥接实现类来画出不同颜色的圆。 我们有一个作为桥接实现的 DrawAPI 接口和实现了 DrawAPI 接口的实体类 RedCircle、GreenCircle。Shape 是一个抽象类将使用 DrawAPI 的对象。BridgePatternDemo 类使用 Shape 类来画出不同颜色的圆。 2.1 代码实现
步骤 1 创建桥接实现接口。
DrawAPI.java public interface DrawAPI {public void drawCircle(int radius, int x, int y);
}步骤 2 创建实现了 DrawAPI 接口的实体桥接实现类。
RedCircle.java public class RedCircle implements DrawAPI {Overridepublic void drawCircle(int radius, int x, int y) {System.out.println(Drawing Circle[ color: red, radius: radius , x: x, y ]);}
}GreenCircle.java public class GreenCircle implements DrawAPI {Overridepublic void drawCircle(int radius, int x, int y) {System.out.println(Drawing Circle[ color: green, radius: radius , x: x, y ]);}
}步骤 3 使用 DrawAPI 接口创建抽象类 Shape。
Shape.java public abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI){this.drawAPI drawAPI;}public abstract void draw();
}步骤 4 创建实现了 Shape 抽象类的实体类。
Circle.java public class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x x; this.y y; this.radius radius;}public void draw() {drawAPI.drawCircle(radius,x,y);}
}步骤 5 使用 Shape 和 DrawAPI 类画出不同颜色的圆。
BridgePatternDemo.java public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle new Circle(100,100, 10, new RedCircle());Shape greenCircle new Circle(100,100, 10, new GreenCircle());redCircle.draw();greenCircle.draw();}
}步骤 6 执行程序输出结果 Drawing Circle[ color: red, radius: 10, x: 100, 100]Drawing Circle[ color: green, radius: 10, x: 100, 100]本文是博主的粗浅理解可能存在一些错误或不完善之处如有遗漏或错误欢迎各位补充谢谢 如果觉得这篇文章对您有所帮助的话请动动小手点波关注你的点赞收藏⭐️转发评论都是对博主最好的支持~