桥接模式

一.定义

  • 桥接是用于把抽象化与实现化解耦,使得两者可以独立变化。
  • 这种类型的设计模式属于结构模式
  • 它通过提供抽象化和实例化之间的桥接结构,来实现两者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

二.代码体现

  • 将银行与账户作为两个抽象类,实现查看账户存款的类型(死期,活期),并输出银行的类型(中国农业银行和中国工商银行)。
    桥接模式
  • 观察图中的方法,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();
    }
}
上一篇:作业-python银行开户


下一篇:【Java-1】设计模式