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

 

 

posted on 2019-09-15 14:05  菜鸟乙  阅读(181)  评论(0编辑  收藏  举报