一、桥接模式定义与类型:
》定义:将抽象部分与它的具体实现部分分离,使他们都可以独立地变化
》通过组合的方式建立两个类之间的关系,而不是继承
》类型:结构型
二、适用场景
》抽象和具体实现之间增加更多的灵活性
》一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立
进行扩展
》不希望使用继承,或因为多层继承导致系统类的个数剧增。
三、桥接优点:
》分离抽象部分及其具体实现部分
》提高了系统的可扩展性
》符合开闭原则
》符合合成复用原则
四、桥接缺点:
》增加了系统的理解与设计难度
》需要正确地识别出系统中两个独立维度的部分
五、相关设计模式
》桥接模式和组合模式
》桥接模式和适配器模式
六、代码实践:
场景:一个用户可以打开并查看自己的不同银行不同账户类型(定期和活期)的银行账户。比如中国农业银行、中国工商银行。。。,每个银行也都有定期、活期等等不同账户类型。银行种类可扩展,每个银行自己的账户类型也可扩展。银行和账户类型可以不同方式排列组合,这样一个用户就可以拥有大量账户。如何通过简单的方式实现这些,并具备可扩展、可维护性呢?
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>中,