论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
桥接模式
桥接模式
王海鱼
金牌会员
|
2023-9-18 01:06:36
|
显示全部楼层
|
阅读模式
楼主
主题
926
|
帖子
926
|
积分
2778
桥接模式
案例引入
对不同的手机类型和不同品牌实现操作(如开机,关机,上网,打电话等)。
如手机的类型有折叠式,直立式等。手机品牌有华为,小米,vivo等。
传统方式实现案例UML图
传统方式问题分析
1.扩展性问题,如果再增加手机的样式,就需要增加各个品牌手机的类,同样我们如果增加一个手机品牌,也要在各个手机样式下增加类,很容易引起类爆炸问题。
2.很多类,会有很大的代码维护成本。
3.使用桥接模式解决。
基本介绍
1.桥接模式(Bridge Pattern)是指,将实现和抽象放在两个不同的类层次中,使两个层次间可以独立改变。
2.桥接模式是一种结构设计模式。
3.桥接模式基于类的最小设计原则,通过使用封装,聚合及继承等行为,让不同的类承担不同的职责。它的主要特点就是把抽象(Abstraction)与实现(Implementation)分离开来,从而保持各部分的独立性以及应对其功能扩展。
桥接模式UML类图
类图说明
1.Client类,桥接模式使用者。
2.抽象类(Abstraction),维护了Implementor/即它的实现类,ConcreteImplementorA..,二者聚合,Abstraction充当桥接类。
3.RefinedAbstraction,是Abstraction抽象类的子类。
4.Implementor是行为实现类的接口。
5.ConcreteImplementorA/B,行为的具体实现类。
6.从UML图中看,抽象类和接口是聚合关系,其实是调用和被调用的关系。
桥接模式实现案例
UML图
代码
public interface Brand {
public void open();
public void close();
public void call();
}
public class Vivo implements Brand{
@Override
public void call() {
System.out.println("Vivo手机打电话");
}
@Override
public void open() {
System.out.println("Vivo手机开机");
}
@Override
public void close() {
System.out.println("Vivo手机关机");
}
}
public class XiaoMi implements Brand{
@Override
public void call() {
System.out.println("XiaoMi手机打电话");
}
@Override
public void open() {
System.out.println("XiaoMi手机开机");
}
@Override
public void close() {
System.out.println("XiaoMi手机关机");
}
}
public abstract class Phone {
private Brand brand;
public Phone(Brand brand){
this.brand = brand;
}
public Phone() {
}
public void open(){
brand.open();
}
public void close(){
brand.close();
}
public void call(){
brand.call();
}
}
public class FoldedPhone extends Phone{
public FoldedPhone(Brand brand){
super(brand);
}
public void open(){
super.open();
System.out.println("折叠样式手机");
}
public void close(){
super.close();
System.out.println("折叠样式手机");
}
public void call(){
super.call();
System.out.println("折叠样式手机");
}
}
public class UpRightPhone extends Phone{
public UpRightPhone(Brand brand){
super(brand);
}
public void open(){
super.open();
System.out.println("直立样式手机");
}
public void close(){
super.close();
System.out.println("直立样式手机");
}
public void call(){
super.call();
System.out.println("直立样式手机");
}
}
public class Client {
public static void main(String[] args) {
Phone vivo_phone = new FoldedPhone(new Vivo());
vivo_phone.open();
vivo_phone.call();
vivo_phone.close();
System.out.println("====================");
Phone xiaoMi_phone = new UpRightPhone(new XiaoMi());
xiaoMi_phone.open();
xiaoMi_phone.call();
xiaoMi_phone.close();
}
}
复制代码
桥接模式在JDBC源码分析
1.JDBC的Driver接口,从桥接模式来看,Driver就是一个接口,下面有MySQL的Driver类,Oracle的Driver,这些就可以当作接口实现类
2.核心代码
package com.mysql.cj.jdbc; //这是mysql包下的Driver
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
//注册mysql驱动
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
复制代码
说明,MySQL有自己的ConnectionImpl类,MySQL的Driver和Connection之间是通过DriverManager(java.sql)的类进行桥连接的。
UML图
注意事项和细节
1.实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
2.对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
3.桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
4.桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
5.桥接模式要求正确识别出系统中两个独立变化的维度(抽象、和实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。
桥接模式应用场景举例
1.对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.
2.常见的应用场景:
-JDBC驱动程序
-银行转账系统
转账分类: 网上转账,柜台转账,ATM转账
转账用户类型: 普通用户,银卡用户,金卡用户..
-消息管理
消息类型: 即时消息,延时消息
消息分类: 手机短信,邮件消息,QQ消息...
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
王海鱼
金牌会员
这个人很懒什么都没写!
楼主热帖
在Winform开发中,使用Async-Awati异步 ...
Vue 和 Django 前后端分离实践 (注册 ...
如何在 Vue 3 中使用<script lang=“t ...
C#依赖注入(直白明了)讲解 一看就会系 ...
一条SQL的执行原理
go中 for循环的坑
教务管理系统——数据库课程设计mysql+ ...
Vulnhub之Monkeybox详细测试过程(不同 ...
银河麒麟V10安装达梦数据库DM8 ...
【Django】DRF开发中的一些技巧记录 ...
标签云
存储
服务器
快速回复
返回顶部
返回列表