设计模式-桥接模式
一、定义
将抽象和实现解耦,使得两者可以独立地变化。
桥接模式的四个角色:
Abstraction抽象化角色:定义角色行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
Implementor实现化角色:接口或抽象类,定义角色必须的行为或属性。
RefinedAbstraction修正抽象化角色:扩充抽象化角色。
ConcreateImplementor具体实现化角色:实现化角色的实现类。
二、类型
结构型
三、适用场景
- 不适合使用继承的场景:继承产生类爆炸。
- 接口或抽象类不稳定的场景:明知接口或抽象类不稳定还使用继承或实现的方式完成业务需求。
- 重用性要求较高的场景:设计的粒度越细,则被重用的可能性越大,采用继承则受到父类的限制,不可能出现太细的粒度。
四、优点
- 抽象和实现分离:实现可以不受抽象约束,不用再绑定在一个固定的抽象层次上。
- 优秀的扩充能力:对外暴露接口,实现对应的接口即可完成功能的添加。
- 实现细节对客户透明:客户不用关心实现细节,它已经由抽象层通过聚合关系完成了封装。
五、缺点
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
六、类图
七、代码实现
Abstraction抽象化角色:
package com.wms.structural.bridge; import java.sql.Connection; public abstract class ConvertDataToFile { private DBConnection connection; public ConvertDataToFile(DBConnection connection) { this.connection = connection; } public Connection getConnection() { return this.connection.getConnection(); } public abstract void convertToFile(); }
Implementor实现化角色:
package com.wms.structural.bridge; import java.sql.Connection; public interface DBConnection { Connection getConnection(); }
RefinedAbstraction修正抽象化角色:
1)
package com.wms.structural.bridge; public class ConvertDataToTxtFile extends ConvertDataToFile { public ConvertDataToTxtFile(DBConnection connection) { super(connection); } public void convertToFile() { this.getConnection(); System.out.println("转换为txt文件"); } }
2)
package com.wms.structural.bridge; public class ConvertToPdfFile extends ConvertDataToFile { public ConvertToPdfFile(DBConnection connection) { super(connection); } @Override public void convertToFile() { this.getConnection(); System.out.println("转换为pdf文件"); } }
ConcreateImplementor具体实现化角色:
1)
package com.wms.structural.bridge; import java.sql.Connection; public class MysqlDBConnection implements DBConnection { public Connection getConnection() { System.out.println("获取mysql数据连接"); return null; } }
2)
package com.wms.structural.bridge; import java.sql.Connection; public class OracleDBConnection implements DBConnection { public Connection getConnection() { System.out.println("获取oracle数据连接"); return null; } }
测试类:
package com.wms.structural.bridge; public class Test { public static void main(String[] args) { // new操作在框架中可以使用依赖注入 DBConnection mysqlConnection = new MysqlDBConnection(); DBConnection oracleConnection = new OracleDBConnection(); ConvertDataToFile convertDataToTxtFile = new ConvertDataToTxtFile(mysqlConnection); convertDataToTxtFile.convertToFile(); convertDataToTxtFile = new ConvertDataToTxtFile(oracleConnection); convertDataToTxtFile.convertToFile(); ConvertDataToFile convertDataToPdfFile = new ConvertToPdfFile(oracleConnection); convertDataToPdfFile.convertToFile(); } }