• JAVA设计模式之桥接模式


    JAVA设计模式之桥接模式

    1. 定义

    将具体部分与他的实现部分分离,使他们可以独立的变化

    通过组合的方式建立两个类的联系,而不是继承

    2. 类型

    结构型

    3. 适用场景

    1. 抽象和具体之间增加更多的灵活性,使用桥接模式避免了使这两个层次之间产生静态的继承关系,

    通过桥接模式使他们建立关联关系,抽象部分和具体的实现部分都可以继承的方式独立扩展互不影响

    1. 一个存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
    2. 不希望使用继承,或因为多层继承导致系统类的个数剧增

    4. 优点

    1. 分类抽象部分与具体实现部分
    2. 提高了系统的扩展性
    3. 符合开闭原则
    4. 符合合成复用原则

    5. 缺点

    增加了系统的理解与设计难度

    需要正确识别出系统两个部分的唯独

    6. 相关设计模式

    1. 桥接模式与组合模式

      组合模式强调部分与整体的组合,桥接模式强调的是

    2. 桥接模式和适配器模式

      适配器模式是改变已有的接口,让他们之间可以相互配合,桥接模式是分离抽象和具体的实现,目的是分离,

    7. coding

    7.1 银行账户接口

    public interface IAccount {
    
        IAccount openAccount();
    
        void getAccountType();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7.2定期账号实现接口

    public class DepositAccount implements IAccount {
        @Override
        public IAccount openAccount() {
    
            System.out.println("这是一个定期账号");
            return new DepositAccount();
        }
    
        @Override
        public void getAccountType() {
            System.out.println("这是一个定期账号类型");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    7.3 活期账号实现接口

    /**
     * @ClassName SavingAccount
     * @Description TODO
     * @Author maido
     * @Date 1:25 2022/10/28
     * @Version 1.0
     **/
    public class SavingAccount implements IAccount {
        @Override
        public IAccount openAccount() {
            System.out.println("打开活期账号");
            return new SavingAccount();
        }
    
        @Override
        public void getAccountType() {
    
            System.out.println("这是活期账号");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    7.4 银行抽象接口桥接账号方法

    public abstract class Bank  {
    
        protected IAccount account;
    
        public Bank(IAccount account) {
            this.account = account;
        }
    
        abstract   IAccount openAccount();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7.5 农业银行继承银行类

    public class ABCBank extends Bank {
        public ABCBank(IAccount account) {
            super(account);
        }
    
        @Override
        IAccount openAccount() {
            System.out.println("打开中国农业银行");
            return account;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7.6 工商银行继承银行类

    public class ICBCBank extends Bank{
        public ICBCBank(IAccount account) {
            super(account);
        }
    
        @Override
        IAccount openAccount() {
    
            System.out.println("这是中国工商银行账户");
            return account;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7.7 uml 关系图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPp4f26b-1666894174067)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221028014352476.png)]

    7.8 测试类

    public class MainTest {
    
        public static void main(String[] args) {
            Bank icbcBank = new ICBCBank(new DepositAccount());
            IAccount iAccount = icbcBank.openAccount();
            iAccount.getAccountType();
    
            Bank abcBank = new ABCBank(new SavingAccount());
            IAccount openAccount = abcBank.openAccount();
            openAccount.getAccountType();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    8. 源码实现

    8.1 Driver 、DriverManager 、 DriverInfo

    8.1.1 来源
    java.sql.Driver
    java.sql.DriverManager 
    java.sql.DriverInfo 
    
    • 1
    • 2
    • 3

    8.1.2 coding

      public static synchronized void registerDriver(java.sql.Driver driver,
                DriverAction da)
            throws SQLException {
    
            /* Register the driver if it has not already been added to our list */
            if(driver != null) {
                registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
            } else {
                // This is for compatibility with the original DriverManager
                throw new NullPointerException();
            }
    
            println("registerDriver: " + driver);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    mysql

      static {
            try {
                DriverManager.registerDriver(new Driver());
            } catch (SQLException var1) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    DriverManager是桥接的具体连接条件,通过注册驱动实现不同的驱动形式

  • 相关阅读:
    Kubeadm部署k8s集群 && kuboard
    Java毕业设计之评教评分教务管理系统springboot mybatis
    Squeeze-and-Excitation Networks
    JAVA -华为真题-分奖金
    ReentrantLock通过Condition实现锁对象的监视器功能
    hive中get_json_object获取多个字典中同一个key的value
    使用TPDSS连接GaussDB数据库
    解决vue2升级vue3后,输入框无法输入的问题
    软件系统设计方法和工具介绍
    vhost-user
  • 原文地址:https://blog.csdn.net/hyzsuccess/article/details/127536540