zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 15-2 桥接模式Coding

    1    代码演练

    1.1  代码演练1

    1.2  代码演练2

     

    1    代码演练
    1.1  代码演练1

    需求:

    打印出从银行获取的账号类

    优点:

    a  假如我只用用一个银行接口 去获取账号的内容,银行实现类要有定期账号和活期账号两个方法,如果实现类特别多,很容易类爆炸。

    b  而使用桥接模式可以 让实现(账号类)和抽象(银行类)分离,银行属性增加修改银行类即可,账号类属性增加修改账号类即可。逻辑清晰,同时也解决了上述类爆炸的情况。

    uml:

    账号接口:

    package com.geely.design.pattern.structural.bridge;
    
    /**
     * 银行账号接口,有存款账号和活期账号 两种账号
     */
    public interface Account {
        //获得账号
        Account openAccount();
        //查看账号类型,是活期账号还是 定期账号
        void showAccount();
    }

    活期账号:

    package com.geely.design.pattern.structural.bridge;
    
    public class SavingAccount implements Account{
    
        @Override
        public Account openAccount() {
            System.out.println("打开活期账号");
            return new SavingAccount();
        }
    
        @Override
        public void showAccount() {
            System.out.println("这是活期账号");
        }
    }

    定期账号:

    package com.geely.design.pattern.structural.bridge;
    
    public class DepositAccount implements Account {
        @Override
        public Account openAccount() {
            System.out.println("打开定期账号");
            return new DepositAccount();
        }
    
        @Override
        public void showAccount() {
            System.out.println("这是一个定期账号");
        }
    }

    银行接口:

    package com.geely.design.pattern.structural.bridge;
    
    /**
     * 该类要写成一个抽象类,因为可能有农业银行,工商银行等银行继承该类
     */
    public abstract class Bank {
        /**
         * 声明子类,因为银行查看账号 需要引用到账号类
         */
        protected Account account;
    
        /**
         * 通过构造方法注入银行账号
         */
        public Bank(Account account) {
            this.account = account;
        }
    
        abstract Account openAccount();
    }

    ABC银行:

    package com.geely.design.pattern.structural.bridge;
    
    /**
     * 创建中国农业银行
     */
    public class ABCBank extends Bank{
    
        public ABCBank(Account account) {
            super(account);
        }
    
        @Override
        Account openAccount() {
            System.out.println("打开中国农业银行账号");
            return account;
        }
    }

    爱存不存银行:

    package com.geely.design.pattern.structural.bridge;
    
    public class ICBCBank extends Bank{
        public ICBCBank(Account account) {
            super(account);
        }
    
        @Override
        Account openAccount() {
            System.out.println("打开中国工商银行");
            return account;
        }
    }

    测试类:

    package com.geely.design.pattern.structural.bridge;
    
    public class Test {
        public static void main(String [] args){
            Bank bank1 = new ICBCBank(new DepositAccount());
            Account account1 = bank1.openAccount();
            account1.showAccount();
    
            Bank bank2 = new ICBCBank(new SavingAccount());
            Account account2 = bank2.openAccount();
            account2.showAccount();
    
            Bank bank3 = new ABCBank(new DepositAccount());
            Account account3 = bank3.openAccount();
            account3.showAccount();
        }
    }

    打印日志:

    打开中国工商银行
    这是一个定期账号
    打开中国工商银行
    这是活期账号
    打开中国农业银行账号
    这是一个定期账号
    
    Process finished with exit code 0
    1.2  代码演练2(补充1.1的缺陷:没有将委托实现)

    注意看:

    ABCBANK,爱存不存Bank和打印日志。其余类同1.1,不再展示。

    UML类图:

    ABCBank:

    package com.geely.design.pattern.structural.bridge;
    
    /**
     * 创建中国农业银行
     */
    public class ABCBank extends Bank{
    
        public ABCBank(Account account) {
            super(account);
        }
    
        @Override
        Account openAccount() {
            account.openAccount();
            System.out.println("打开中国农业银行账号");
            return account;
        }
    }

    爱存不存Bank:

    package com.geely.design.pattern.structural.bridge;
    
    public class ICBCBank extends Bank{
        public ICBCBank(Account account) {
            super(account);
        }
    
        @Override
        Account openAccount() {
            account.openAccount();
            System.out.println("打开中国工商银行");
            return account;
        }
    }

    打印日志:

    打开定期账号
    打开中国工商银行
    这是一个定期账号
    打开活期账号
    打开中国工商银行
    这是活期账号
    打开定期账号
    打开中国农业银行账号
    这是一个定期账号
    
    Process finished with exit code 0

     

  • 相关阅读:
    MySQL Server 5.0安装教程
    c++实现一个小算法
    spring core 与 context理解
    关于eclipse的mysql连接配置
    eclipse中创建一个maven项目
    Oracle中的多表查询(笛卡尔积原理)
    Vue进阶
    计算机网络基础
    java框架之springboot
    bootstrap学习
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/11522166.html
Copyright © 2011-2022 走看看