首页 > 其他分享 >设计模式 - 桥接模式

设计模式 - 桥接模式

时间:2022-12-20 12:31:09浏览次数:53  
标签:Implementor 桥接 void db 模式 export 设计模式 public

目录

  • ​实例​
  • ​​数据转换工具​​
  • ​桥接模式​
  • ​​概念​​
  • ​​角色定义​​
  • ​​典型代码​​
  • ​​具体实现​​
  • ​​总结​​
  • ​​源码​​

实例

数据转换工具

​Sunny​​​软件公司欲开发一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例如​​txt​​​、​​xml​​​、​​pdf​​等格式,同时该工具需要支持多种不同的数据库

设计模式 - 桥接模式_抽象类

初始设计方案如上图所示,使用了一种多层继承结构,​​Data​​​是抽象父类,每一种类型的文件类如​​XmlData​​​、​​TxtData​​​等作为其直接子类;每一种数据来源于不同的数据库,不同的数据类再提供一组在不同数据库的子类,不难看出,该方案存在以下问题:
(1) 采用了多层继承结构,导致系统中类的个数急剧增加
(2) 系统扩展麻烦,由于每一个具体类既包含数据格式信息,又包含数据库信息,增加每一个维度都需要增加大量的具体类


桥接模式

概念

  • 桥接模式(​​Bridge Pattern​​):将抽象部分与它的实现部分分离,使它们都可以独立地变化
  • 桥接模式通过组合的方式建立两个类之间的联系,而不是继承
  • 桥接模式是一种对象结构型模式
  • 桥接模式又称为柄体(​​Handle and Body​​​)模式或接口(​​Interface​​)模式
  • 桥接模式结构图(来自刘伟老师技术博客)

设计模式 - 桥接模式_design_pattern_02


角色定义

角色

名称

释义

Abstraction

抽象类

用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法

RefinedAbstraction

扩充抽象类

扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法

Implementor

实现类接口

定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系

ConcreteImplementor

具体实现类

具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法


典型代码

  • ​Implementor​
interface Implementor {
public void operationImpl();
}
  • ​Abstraction​
abstract class Abstraction {
protected Implementor impl; //定义实现类接口对象

public void setImpl(Implementor impl) {
this.impl=impl;
}

public abstract void operation(); //声明抽象业务方法
}
  • ​RefinedAbstraction​
class RefinedAbstraction extends Abstraction {
public void operation() {
//业务代码
impl.operationImpl(); //调用实现类的方法
//业务代码
}
}


具体实现

  • ​DB.java​
/**
* @Description 抽象数据库:实现类接口
*/
public interface DB {
/**
* 获取数据
*/
void export();
}
  • ​MysqlDB.java​
/**
* @Description Mysql数据库实现类:具体实现类
*/
public class MysqlDB implements DB {
@Override
public void export() {
System.out.print("获取Mysql数据 ");
}
}
  • ​OracleDB.java​
/**
* @Description Oracle数据库实现类:具体实现类
*/
public class OracleDB implements DB {
@Override
public void export() {
System.out.print("获取Oracle数据 ");
}
}
  • ​Data.java​
/**
* @Description 抽象数据类:抽象类
*/
public abstract class Data {

protected DB db;

public Data(DB db) {
this.db = db;
}

/**
* 导出数据
*/
public abstract void export();
}
  • ​PdfData.java​
/**
* @Description PDF格式数据:扩充抽象类
*/
public class PdfData extends Data {

public PdfData(DB db) {
super(db);
}

@Override
public void export() {
db.export();
System.out.println("导出格式为PDF");
}
}
  • ​TxtData.java​
/**
* @Description TXT格式数据:扩充抽象类
*/
public class TxtData extends Data {

public TxtData(DB db) {
super(db);
}

@Override
public void export() {
db.export();
System.out.println("导出格式为TXT");
}
}
  • ​XmlData.java​
/**
* @Description XML格式数据:扩充抽象类
*/
public class XmlData extends Data {

public XmlData(DB db) {
super(db);
}

@Override
public void export() {
db.export();
System.out.println("导出格式为XML");
}
}
  • ​Test.java​
/**
* @Description 桥接模式测试类
*/
public class Test {
public static void main(String[] args) {
Data txtData = new TxtData(new MysqlDB());
txtData.export();

Data pdfData = new PdfData(new MysqlDB());
pdfData.export();

Data xmlData = new XmlData(new OracleDB());
xmlData.export();
}
}
  • 输出如下:
获取Mysql数据 导出格式为TXT
获取Mysql数据 导出格式为PDF
获取Oracle数据 导出格式为XML
  • 类图如下:

设计模式 - 桥接模式_桥接模式_03


总结

  • 优点
1.分离抽象部分及其具体实现部分
2.提高了系统的可扩展性
3.符合开闭原则
4.符合合成复用原则
  • 缺点
1.增加了系统的理解和设计难度
2.需要正确地识别出系统中两个独立变化的维度
  • 适用场景
1.抽象和具体实现之间增加更多的灵活性
2.一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
3.不希望使用继承,或因为多层继承导致系统类的个数激增
  • 相关设计模式
1.桥接模式和组合模式
组合模式强调部分和整体间的组合
桥接模式强调平行级别上不同类的组合
2.桥接模式和适配器模式
适配器模式可以把功能上相似,接口不同的类适配起来工作
桥接模式是把类的抽象和具体实现分离开,在此基础上使这些层次结合起来
  • 桥接模式源代码
Driver(JDBC)


源码


- End -

- 个人学习笔记 - - 仅供参考 -


以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦

作者:​​Maggieq8324​​


标签:Implementor,桥接,void,db,模式,export,设计模式,public
From: https://blog.51cto.com/u_15352767/5954727

相关文章

  • java的饿汉和懒汉设计模式
    本文主要讲述java的饿汉和懒汉设计模式饿汉和懒汉设计模式的目的:使得该类的对象,只能有一个,不允许其他类,创建该类的对象。饿汉设计模式示例代码如下:1publiccl......
  • 模式识别,模式识别识的啥
    很多自动化专业的学生在报考的时候都想报考模式识别。你问他为什么要考这个,他可能会说这是最接近人工智能的,或者说这是搞人工智能的。有一次一个家长深夜给我打电话说:“......
  • 智慧园区管理系统,探索“保障性租赁住房+”发展新模式
    “十四五”期间,重庆渝中区新增市民和青年预计达到40.7万人,净增2.09万人。为缓解大量新市民和年轻人租房难、租不到好房子的问题,渝中区坚持盘活现有房源、打造优秀租赁产品......
  • 设计原则与模式013 适配器模式
    适配器模式的定义:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法工作的两个类能够在一起工作;适配器模式的UML图如下,适配器需要将Adaptee被适......
  • 设计模式——策略模式
    一、定义它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的用户。二、特点封装了变化策略模式的Strategy类层次为Context定义了......
  • 设计模式——迭代器模式
    一、定义提供一种方法循序访问一个聚合对象中各个元素,而又不暴露该对象地内部表示和Foreachin功能相同Aggregate类:聚焦抽象类提供创建迭代器地方法ConcreteAggregatelei:......
  • 设计模式中的六种关系以及代码之间的对应
    强弱关系:依赖<关联<聚合<组合<实现<继承 一、依赖battle关联依赖定义对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之......
  • Atom 项目仓库正式归档,进入只读模式
    Atom项目仓库正式归档,进入只读模式来源:OSCHINA编辑: 局2022-12-1908:46:00 2GitHub正式归档了Atom项目的代码仓库,目前已进入只读模式。Atom是......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司CEO......
  • Spring Cloud 应用 Proxyless Mesh 模式探索与实践
    作者:十眠ServiceMesh简介ServiceMesh早已不是一个新兴的概念,目前已经有许多关于ServiceMesh的探索以及实践。2016年可以说是ServiceMesh的元年,Buoyant公司......