设计模式——桥接模式、装饰器模式

309 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第33天,点击查看活动详情

8 桥接模式

  • 通过定义一个桥接者将抽象及其实现解耦,使二者可以根据需求独立变化。
  • 我们常用的 JDBCDriverManager 就使用了桥接模式,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 种设计模式的用意完全不同,也就是说要解决的问题、应用场景不同:

  • 适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。
  • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。