详细介绍Java桥接模式
时间:2022-05-01 [网络编程]作者:fabuyuan 浏览:5 次
推荐学习:《java视频教程》
其实在现实生活中,有很多类可以有两个或多个维度的变化,如图形既可按形状分,又可按颜色分,如果用继承方式,m 种形状和 n 种颜色的图形就有 m*n 种,不但对应的子类很多,而且扩展比较困难。
比如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。
1、桥接模式的定义
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度
模式类型:结构设计模式
原理类图:
原理类图说明:
- Client类: 桥接模式的调用者
- 抽象类(Abstraction) : 维护了Implementor/即它的实现类ConcretelmplementorA…二者是器合关系,Abstraction充当桥接英
- RehinedAbstraction: 是Abstraction抽象类的子类lmplementor:行为实现类的接口
- ConcretelmplementorA/B: 行为的具体实现类
- 从UML图: 这里的抽象类和接口是聚合的关系,其实调用和被调用关系
2、桥接模式的优缺点
优点:
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
缺点:
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度
3、桥接模式的结构
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色: 定义抽象类,并包含一个对实现化对象的引用
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现
结构图:
该结构图的实现代码:
实视化角色:
/** * 实视化角色 */public interface Implemntor { public void OperationImpl();}
具体实现化角色:
/** * 具体实现化角色 */public class ConcreteImplementorA implements Implemntor{ @Override public void OperationImpl() { System.out.println("具体实现化角色被访问"); }}
抽象化角色:
/** * 抽象化角色 */public abstract class Abstraction { protected Implemntor implemntor; protected Abstraction(Implemntor implemntor){ this.implemntor = implemntor; } public abstract void Operation();}
扩展抽象化角色:
/** * 扩展抽象化角色 */public class RefinedAbstraction extends Abstraction{ protected RefinedAbstraction(Implemntor implemntor) { super(implemntor); } public void Operation(){ System.out.println("扩展抽象化角色被访问"); implemntor.OperationImpl(); }}
测试类:
public class Test { public static void main(String[] args) { Implemntor implemntor = new ConcreteImplementorA(); Abstraction abs = new RefinedAbstraction(implemntor); abs.Operation(); }}
输出:
扩展抽象化角色被访问 具体实现化角色被访问
4 、桥接模式的案例实现
将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变
交通工具在路上行驶,这里有两个维度的变化,交通工具的类型不同,路也分水泥路和柏油路
类图:
交通工具类:
/** * 交通工具类 */public interface Vehicle { public void drive();}
具体的交通工具:小汽车
/** * 具体的交通工具:小汽车 */public class Car implements Vehicle{ @Override public void drive() { System.out.println("小汽车"); }}
具体的交通工具:大巴车
/** * 具体的交通工具:大巴车 */public class Bus implements Vehicle{ @Override public void drive() { System.out.println("大巴车"); }}
抽象的路:
/** * 抽象的路 */public abstract class Road { protected Vehicle vehicle; public Road(Vehicle vehicle){ this.vehicle = vehicle; } public abstract void driveOnRoad();}
具体的路:油柏路
/** * 具体的路:油柏路 */public class UnpavedRoad extends Road{ public UnpavedRoad(Vehicle vehicle) { super(vehicle); } @Override public void driveOnRoad() { super.vehicle.drive(); System.out.println("行驶在油柏路"); }}
具体的路:水泥路
/** * 具体的路:水泥路 */public class CementRoad extends Road{ public CementRoad(Vehicle vehicle) { super(vehicle); } @Override public void driveOnRoad() { super.vehicle.drive(); System.out.println("行驶在水泥路"); }}
测试类:
//测试public class Test { public static void main(String[] args) { Road roadCar = new CementRoad(new Car()); roadCar.driveOnRoad(); Road roadBus = new CementRoad(new Bus()); roadBus.driveOnRoad(); }}
输出:
小汽车 行驶在水泥路 大巴车 行驶在水泥路
5、桥接模式的注意事项
- 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统
- 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成
- 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
- 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景
6、桥接模式应用场景
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.
推荐学习:《java视频教程》
以上就是详细介绍Java桥接模式的详细内容,更多请关注站长家园其它相关文章!
本文标签: java
转载请注明来源:详细介绍Java桥接模式
本文永久链接地址:https://www.adminjie.com/post/11920.html
免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!
版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:提交版权证明文件到邮箱 2225329873#qq.com(#换为@) 站长会进行审查之后,情况属实的会在三个工作日内为您删除。
更多精彩内容
- VUE中V-IF条件判断改变元素的样式操作
- Discuz如何解决安装时报错run_sql_error
- 低版本VS项目在VS2019无法正常编译的问题
- PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
- Oracle数据库的实例/表空间/用户/表之间关系简单讲解
- RSA2是啥?PHP-RSA2签名验证怎么实现?
- 华为dubal20是什么型号
- ana an00华为是什么型号
- html5的标题标记一共有几个等级
- app是什么应用程序的简称
- html5中onclick是什么意思
- 超链接的作用是什么
- 电脑显示信号线无连接是什么意思
- 小程序大小超限除了分包还能怎么做?如何避免和解决大小限制?
- angular与bootstrap的区别是什么

- 最新文章
-
-
linux怎么查看mysql错误日志
方法:1、利用“cd/usr/local/mysql/data”命令进入mysql安装目录中的data目录;3、利用“ll”命令获取目录下的文件,并找到后缀...
-
php中链接符什么意思
在php中,链接符指的是链接字符串的符号,作用是拼接字符,可以把两个或两个以上的字符串拼接成一个新的字符串。PHP链接符有两种:1、“.”连接符,只是简单的拼接...
-
一文掌握Excel动态合并工作表技巧
本篇文章给大家带来了关于excel的相关知识,其中主要介绍了关于动态合并工作表的技巧,怎样将不同工作表中的数据合并在一起,下面一起来看一下,希望对大家有帮助。手...
-
php中如何判断是奇数还是偶数
在php中,可以利用求余运算符“%”和相等运算符“==”来判断一个数是奇数还是偶数,只需用“%”运算符获取指定数除以2后的余数,并用“==”运算符判断该余数是否...
-
归纳整理常见SQL注入类型以及原理
本篇文章给大家带来了关于SQL的相关知识,其中主要介绍了常见的SQL注入类型的介绍以及原理讲解,包括了联合注入、布尔盲注、时间注入、报错注入等等内容,下面一起来...
-
- 热门文章
-
-
VUE中V-IF条件判断改变元素的样式操作
这篇文章主要介绍了VUE中V-IF条件判断改变元素的样式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧...
-
Discuz如何解决安装时报错run_sql_error
问题环境VMware虚拟机Centos7.3PHP7.0MySQL8.0NGINX1.14Discuz3.4问题还原本地环境为PHP5.6+MySQL5.6在安...
-
低版本VS项目在VS2019无法正常编译的问题
低版本VS项目在VS2019无法正常编译的问题这里指的编译并不准确,只是为了方便说明。后有(未安装),201?...
-
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
实现原理使用redis链表来做,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用。实现步骤第一步,先将商品库存入队列/**.trigge...
-
Oracle数据库的实例/表空间/用户/表之间关系简单讲解
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。我们用这些高级权限账号...
-