一.定义
- 桥接是用于把抽象化与实现化解耦,使得两者可以独立变化。
- 这种类型的设计模式属于结构模式
- 它通过提供抽象化和实例化之间的桥接结构,来实现两者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
二.代码体现
- 将银行与账户作为两个抽象类,实现查看账户存款的类型(死期,活期),并输出银行的类型(中国农业银行和中国工商银行)。
- 观察图中的方法,
Bank
抽象类与Account
接口打交道。并且,Bank
的子类也只是调用了Account
这个接口,并未直接调用接口实现。如果修改Account
子类,那么Bank
的子类不会受到影响,这样就体现了解耦的思想。
-
Bank
类中的openAccount
方法实际上是Account
接口中openAccount
方法的代理,使用的时候直接调用,这符合迪米特原则。
public interface Account {
Account openAccount();
void showAccountType();
}
public class DepositAccount implements Account{
@Override
public Account openAccount() {
System.out.println("打开定期账号");
return new DepositAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
public class SavingAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开活期账号");
return new SavingAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
public abstract class Bank {
//账号
protected Account account;
//构造函数
public Bank(Account account) {
this.account = account;
}
abstract Account openAccount();
}
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行账号");
account.openAccount();
return account;
}
}
public class Test {
public static void main(String[] args) {
Bank icbcBank = new ICBCBank(new DepositAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
Bank icbcBank2 = new ICBCBank(new SavingAccount());
Account icbcAccount2 = icbcBank2.openAccount();
icbcAccount2.showAccountType();
Bank abcBank = new ABCBank(new SavingAccount());
Account abcAccount = abcBank.openAccount();
abcAccount.showAccountType();
}
}