• 设计模式-桥接模式


    一、定义

     将抽象和实现解耦,使得两者可以独立地变化。

    桥接模式的四个角色:

    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();
        }
    }
  • 相关阅读:
    根据CPU核数合理设置线程池大小
    jvm类加载的过程
    springboot2.x整合redis实现缓存(附github链接)
    记录一次坎坷的debug之旅,NUXT框架页面多开假死现象,NUXT刚开始可以访问,突然就访问无响应,并且前后端均未出现任何报错提示:现在是早晨4点35分
    hibernate用Query.setFirstResult和Query.setMaxResults分页时,传入的manresults不能为0,否则解析后的sql会去查全表数据
    工作时发现oracle的分页查询的数据会重复,进行分析并给出解决方式
    看别人的代码是进步最快的方式
    关于电磁炉使用时造成的电磁场导致洗衣机等电器失效的情况总结
    关于在项目中创建一个新的线程之后需要将线程持有的数据库连接对象归还的思考
    Oracle分页和mysql分页的区别
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10295644.html
Copyright © 2020-2023  润新知