设计模式-桥接模式

一、桥接模式的核心思想

桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。桥接模式的用意是将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立变化 。这句话有3个关键词,也就是抽象化、实现化和脱耦

  • 抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
  • 实现化:抽象化给出的具体实现,就是实现化。
  • 脱耦:所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联转换成弱关联。

将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联转换成为弱关联。因此,桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立变化,这就是桥接模式的用意。

桥接模式所涉及的角色如下。

  • 抽象化(Abstraction)角色--桥接类:抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象化(Refined Abstraction)角色--桥接具体类:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色--目标接口:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定与抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(Concrete Implementor)角色--目标实现类:这个角色给出实现化角色接口的具体实现。

如下图所示就是一个实现了桥接模式的示意性系统的结构图。

图中的 Client就可以通过 Bridge桥来实现对 Sourcable 实现类的操作了。

下面来看具体的实现。

(1) Sourcable 类的源代码如下程序所示,它定义了两个操作函数。

源接口 Sourcable.java

java 复制代码
package structure.adapter;

/**
* @author Minggg
* 源接口
*/
public interface Sourcable {
	public void operation();
}

(2) SourceSub1实现了Sourcable接口,实现函数operation()负责输出一个字符串。其源代码如下程序所示。

源接口的实现子类SourceSub1.java

java 复制代码
package structure.adapter;

/**
* @author Minggg
* 源接口的实现类
*/
public class SourceSub1 extends DefaultWrapper {

	public void operation() {
		System.out.printIn("源接口的一个实现子类 Sub1");
	}
}

(3) SourceSub2实现了 Sourcable 接口,实现函数 operation()负责输出一个字符串。其源代码如下程序 所示。

源接口的实现子类SourceSub2.java

java 复制代码
package structure.adapter;

/**
* @author Minggg
* 源接口的实现类
*/
public class SourceSub2 extends DefaultWrapper {

	public void operation() {
		System.out.printIn("源接口的一个实现子类 Sub2");
	}
}

(4) 桥接类 Bridge是一个抽象类,它拥有一个 Sourcable 对象,并可以通过 getter/setter 来设置该对象。其源代码如下程序所示。

桥接类 Bridge.java

java 复制代码
package structure.adapter;

/**
* @author Minggg
* 桥接类
*/
public abstract class Bridge {

	private Sourcable source;
	
	public Sourcable getSource() {
		return source;
	}
		
	public void setSource(Sourcable source){
		this.source = source;
	}
	public void operation() {
		source.operation();
	}

}

(5) 桥接具体类MyBridge是一个Bridge的具体实现,它拥有自己的实现。其源代码如下程序所示。

桥接具体类 MyBridge.java

java 复制代码
package structure.adapter;

/**
* @author Minggg
* 桥接具体类
*/
public class MyBridge extends Bridge {

	public void operation() {
		getSource().operation();
	}
}

以上我们编写了两个实现 SourceSub1和 SourceSub2,下面我们便可以通过 Bridge 桥来实现对它们的调用。首先创建一个桥对象,然后分别给该桥设置不同的目标对象source1和source2,然后调用桥的 operation()即可实现对两个目标的调用。其源代码如下程序所示。

测试类 Client,java

java 复制代码
package structure.adapter;

public class Client {

	public static void main(String[] args) {
		// 创建桥对象
		Bridge bridge = new MyBridge();
		
		// 调用第一个对象
		Sourcable source1 = new SourceSub1();
		bridge.setSource(source1);
		bridge.operation();
		
		// 调用第二个对象
		Sourcable source2 = new SourceSub2();
		bridge.setSource(source2);
		bridge.operation();
	}
}

运行该程序的结果如下:

java 复制代码
源接口的一个实现子类 Sub1
源接口的一个实现子类 Sub2

从输出的结果可以看出,通过 Bridge桥实现了对目标类的调用。

二、何时使用桥接模式

从以上的讲解可以看出,桥接模式与前面几种模式都很相似,但是它们应用的目的和场景不同:

  • 适配器用于将一个类改变为另一个接口,桥接模式是将抽象化与实现分离,使得两者接口不同。
  • 装饰器模式是把一个类扩展功能再转化为同一个接口,而桥接模式是将一个类转化为另一个类来控制。
  • 代理模式是为一个类提供一个统一的代理类,完全可以不操作被代理的类;桥接模式也是提供了一个桥接类,但需要使用该桥接类来进行目标对象的操作。
  • 外观模式是为一系列的类提供一个统一的外观类,完全可以不操作被代理的类;桥接模式也是提供了一个桥接类,但需要使用该桥接类来进行目标对象的操作。

由此可见,桥接模式与前面几种模式都很相似,这是应用的角度不同。它只有在一个系统中拥有更多的抽象化和实现化角色时才使用,目的是为了增加互相操作的灵活性。

三、在Java中的应用--JDBC 桥DriverManager

桥接模式的关键是找出抽象化角色和具体化角色。典型应用是JDBC应用,IDBCAPI属于抽象化角色,而 driver 则属于具体化角色,其中需要通过一个 DriverManager 类根据指定 URL,得到具体实现。

如图下所示,DriverManager 就为我们提供了一个桥,通过这个桥可以实现对各种数据库驱动的加载。

因为有了 DriverManager 桥,我们才可以像下面这样方便地连接各种数据源。

  • JDBC 连接 MySOL
java 复制代码
Class.forName( "org.git.mm.mysql.Driver");
cn = DriverManager.getConnection( "jdbc:mysgl://DBServerlP:3306/myDatabaseName", sUsr, sPwd );
  • JDBC 连接 Oracle
java 复制代码
Class.forName( "oracle.jdbc driver.OracleDriver");
cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521ORCL", sUsr, sPwd );

...另外其他各种数据库连接就不一一展示了

相关推荐
色空大师1 分钟前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)1 分钟前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
2202_7544215419 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介22 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习22 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose24 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热26 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余27 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp28 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea
.Ayang30 分钟前
tomcat 后台部署 war 包 getshell
java·计算机网络·安全·web安全·网络安全·tomcat·网络攻击模型