持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情
8 桥接模式
- 通过定义一个桥接者将抽象及其实现解耦,使二者可以根据需求独立变化。
- 我们常用的
JDBC和DriverManager就使用了桥接模式,JDBC在连接数据库时,在各个数据库之间进行切换而不需要修改代码,因为JDBC提供了统一的接口,每个数据库都提供了各自的实现,通过一个叫作数据库驱动的程序来桥接即可。下面以数据库连接为例介绍桥接模式。 - 实现
interface Driver{
void executeSQL();
}
class MysqlDriver implements Driver{
@Override
public void executeSQL() {
System.out.println("execute sql by mysql driver");//基于MySQL实现了其执行SQL语句的方法
}
}
class OracleDriver implements Driver{
@Override
public void executeSQL() {
System.out.println("execute sql by oracle driver");//基于Oracle实现了其执行SQL语句的方法
}
}
abstract class DriverManagerBridge{
private Driver driver;
public void execute(){
this.driver.executeSQL();
}
public Driver getDriver(){
return driver;
}
public void setDriver(Driver driver){
this.driver = driver;
}
}
class MyDriverBridge extends DriverManagerBridge{
public void execute(){
getDriver().executeSQL();
}
}
public class BridgePattern {
public static void main(String[] args) {
DriverManagerBridge driverManagerBridge = new MyDriverBridge();
// 设置Mysql驱动
driverManagerBridge.setDriver(new MysqlDriver());
driverManagerBridge.execute();
// 切换到Oracle驱动
driverManagerBridge.setDriver(new OracleDriver());
driverManagerBridge.execute();
}
}
9 装饰器模式
- 指在无须改变原有类及类的继承关系的情况下,动态扩展一个类的功能。它通过装饰者来包裹真实的对象,并动态地向对象添加或者撤销功能。
- 实现
interface Sourceable{
public void createComputer();
}
class Source implements Sourceable{
@Override
public void createComputer() {
System.out.println("create computer by Source");
}
}
class Decorator implements Sourceable{
private Sourceable source;
// 装饰者类通过构造函数将Sourceable实例初始化到内部
public Decorator(Sourceable source){
super();
this.source = source;
}
// 调用原方法后加上了装饰者逻辑
@Override
public void createComputer() {
source.createComputer();
System.out.println("make system");
}
}
总结
代理、桥接、装饰器、适配器,这 4 种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类,尽管代码结构相似,但这 4 种设计模式的用意完全不同,也就是说要解决的问题、应用场景不同:
- 适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。
- 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。