work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

桥接模式

Posted on 2019-02-22 09:59  work hard work smart  阅读(181)  评论(0编辑  收藏  举报

一、定义

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

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

类型:结构型

 

二、适用场景

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

2、一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展

3、不希望适用继承,或因为多层继承导致系统的类的个数剧增

 

三、优点

1、分离抽象部分及具体实现部分

2、提高了系统的可扩展性

3、符合开闭原则

4、符合合成复用原则

 

四、缺点

1、增加了系统的理解和设计难度

2、需要正确地识别系统中两个独立变化的维度

 

五、与桥接相关的设计模式

1、桥接模式和组合模式

    组合模式强调部分和整体间的组合

    桥接模式强调平行级别上不同类的组合

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

    两个模式都是让某个东西配合工作

   适配器模式的目的是改变已有的接口,让它们之间可以相互的配合。适配器模式可以把功能相似接口不同的类适配起来。

    桥接模式是分离抽象和具体的实现,目的是分离。

 

六。Coding

场景: 银行(中国农业银行,中国工商银行),账号(活期账号,定期账号)。交叉后就有四种组合。随着银行的增多,账号类型的增多。那么久适用用桥接模式。

1、 创建账号

public interface Account {

    Account openAccount();

    void showAccountType();

}

 

2、创建定期账号

/**
 * 定期账号
 */
public class DepositeAccount  implements  Account{
    @Override
    public Account openAccount() {
        System.out.println("打开定期账号");
        return new DepositeAccount();
    }

    @Override
    public void showAccountType() {
        System.out.println("这是一个定期账号");
    }
}

  

3、创建活期账号

public class SavingAccount  implements  Account{
    @Override
    public Account openAccount() {
        System.out.println("打开活期账号");
        return new SavingAccount();
    }

    @Override
    public void showAccountType() {
        System.out.println("这是一个活期账号");
    }
}

  

4、创建银行

public abstract class Bank {
    protected Account account;
    public Bank(Account account){
        this.account = account;
    }

    abstract Account openAccount();
}

 

5、农业银行

/**
 * 农业银行
 */
public class ABCBank extends Bank {

    public ABCBank(Account account) {
        super(account);
    }

    @Override
    Account openAccount() {
        System.out.println("打开中国农业银行账号");
        account.openAccount();
        return account;
    }
}

  

  

6、工商银行

/**
 * 工商银行
 */
public class ICBCBank extends Bank {

    public ICBCBank(Account account) {
        super(account);
    }

    @Override
    Account openAccount() {
        System.out.println("打开中国工商银行账号");
        account.openAccount();
        return account;
    }
}

  

  

 

7、UML图

 

 右边Bank是抽象部分。

左边openAccount和showAccountType是实现。

Bank和Account是组合关系。

桥接模式的角色:(来自百度百科)

Abstraction(抽象化角色) Bank为抽象类。抽象化给出的定义,并保存一个对实现化对象的引用。

Implementor(实现化角色) Account实现类接口。这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

ConcreteImplementor(具体实现化角色) SavingAccount类和DepositAccont为具体实现类。这个角色给出实现化角色接口的具体实现。

RefinedAbstraction(修正抽象化角色) ABCBank修正抽象化角色。扩展抽象化角色,改变和修正父类对抽象化的定义。

 

8、测试类

public class Test {
    public static void main(String[] args) {
        Bank icbcBank = new ICBCBank(new DepositeAccount());
        Account icbcAccount = icbcBank.openAccount();
        icbcAccount.showAccountType();

        Bank abcBank = new ICBCBank(new SavingAccount());
        Account saveAccount = abcBank.openAccount();
        saveAccount.showAccountType();
    }
}

  

三、在源码中的使用

1、JDBC的Driver接口

DriverManager和DriverInfo