java设计模式之桥接模式

一、桥接模式定义与类型:

》定义:将抽象部分与它的具体实现部分分离,使他们都可以独立地变化

》通过组合的方式建立两个类之间的关系,而不是继承

》类型:结构型

二、适用场景

》抽象和具体实现之间增加更多的灵活性

》一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立

进行扩展

》不希望使用继承,或因为多层继承导致系统类的个数剧增。

三、桥接优点:

》分离抽象部分及其具体实现部分

》提高了系统的可扩展性

》符合开闭原则

》符合合成复用原则

四、桥接缺点:

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

》需要正确地识别出系统中两个独立维度的部分

五、相关设计模式

》桥接模式和组合模式

》桥接模式和适配器模式

六、代码实践:

场景:一个用户可以打开并查看自己的不同银行不同账户类型(定期和活期)的银行账户。比如中国农业银行、中国工商银行。。。,每个银行也都有定期、活期等等不同账户类型。银行种类可扩展,每个银行自己的账户类型也可扩展。银行和账户类型可以不同方式排列组合,这样一个用户就可以拥有大量账户。如何通过简单的方式实现这些,并具备可扩展、可维护性呢?

package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public interface Account {
    //打开账号
    Account openAccount();
    //展示账号类型
    void showAccountType();
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public class DepositAccount implements Account{
    public Account openAccount() {
        System.out.println("打开一个定期账号");
        return new DepositAccount();
    }

    public void showAccountType() {
        System.out.println("这是一个定期账号");
    }
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public class SavingAccount implements Account {
    public Account openAccount() {
        System.out.println("打开活期账号");
        return new SavingAccount();
    }

    public void showAccountType() {
        System.out.println("这是一个活期账号");
    }
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public abstract class Bank {
    protected Account account;

    public Bank(Account account) {
        this.account = account;
    }
    //特别注意这个地方的书写
    abstract Account openOneAccount();
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public class ABCBank extends Bank {
    public ABCBank(Account account) {
        super(account);
        System.out.println("创建一个中国农业银行账户");
    }

    Account openOneAccount() {
        System.out.println("打开中国农业银行账户");
        //注意此处别忘记调用,表示将具体的实现委托给Account类中的该方法
        account.openAccount();
        return account;
    }
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public class ICBCBank extends Bank{

    public ICBCBank(Account account) {
        super(account);
        System.out.println("创建一个中国工商银行账户");
    }

    Account openOneAccount() {
        System.out.println("打开中国工商银行账户");
        //注意此处别忘记调用
        account.openAccount();
        return account;
    }
}
package pattern.structural.bridge;

/**
 * Created by Administrator on 2019/8/17.
 */
public class Test {
    public static void main(String[] args) {
        Bank icbcBank = new ICBCBank(new DepositAccount());
        Account icbcAccount = icbcBank.openOneAccount();
        icbcAccount.showAccountType();
        System.out.println("************");
        Bank icbcBank1 = new ICBCBank(new SavingAccount());
        Account icbcAccount1 = icbcBank1.openOneAccount();
        icbcAccount1.showAccountType();
        System.out.println("************");

        Bank abcBank1 = new ABCBank(new SavingAccount());
        Account abcAccount1 = abcBank1.openOneAccount();
        abcAccount1.showAccountType();



    }
}
"D:\Program Files\Java\jdk1.8.0_102\bin\java" "-javaagent:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=59097:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;E:\JavaDesignMode\target\classes" pattern.structural.bridge.Test
创建一个中国工商银行账户
打开中国工商银行账户
打开一个定期账号
这是一个定期账号
************
创建一个中国工商银行账户
打开中国工商银行账户
打开活期账号
这是一个活期账号
************
创建一个中国农业银行账户
打开中国农业银行账户
打开活期账号
这是一个活期账号

Process finished with exit code 0

类图结构

七、源码解析:

jdk中源码解析:mysql oracle等实现jdbc driver等接口的问题

具体可查看jdbc Driver接口  DriverManager  DriverInfo 类  getConnect()方法、registerDriver等方法   

稍后补充

mysql jdbc实现了jdbc的driver接口

那jdbc如何获取mysql的数据库连接呢?

jdbc中有个类DriverManager类,driverManager有个注册驱动的方法,mysql等

其他数据库通过调用DriverManager的注册驱动的方法,加入到DriverManager中

jdbc即可通过DriverManger获取到mysql的信息。

使用者可以通过jdbc的getConnection获取到实际的mysql数据库的连接

DriverInfo把driver作为自己的一个属性

mysql的Driver通过其内部的静态代码块中调用jdbc的DriverManager的registerDriver()方法,就把mysql的driver加入到了

DriverManager的copyOnWriteArrayList<DriverInfo>中,

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值