• 桥接模式


    一、定义

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

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

    类型:结构型

    二、适用场景

    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

  • 相关阅读:
    Asp.Net根据角色验证
    牛客登录(四)
    外键约束
    update 和replace更新表
    每日一题力扣485
    牛客登录(6)开窗函数
    牛客登录(5)
    MySQL的UPDATE或DELETE中子查询不能为同一张表
    牛客登录(二)
    剑指offer:二分
  • 原文地址:https://www.cnblogs.com/linlf03/p/10416574.html
Copyright © 2020-2023  润新知