首页 > 其他 > 详细

设计模式课程 设计模式精讲 15-2 桥接模式Coding

时间:2019-09-15 16:25:26      阅读:81      评论:0      收藏:0      [点我收藏+]

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

 

 

设计模式课程 设计模式精讲 15-2 桥接模式Coding

原文:https://www.cnblogs.com/1446358788-qq/p/11522166.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!