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的更多相关文章

  1. 设计模式课程 设计模式精讲 13-2 享元模式coding

    1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...

  2. 设计模式课程 设计模式精讲 11-2 装饰者模式coding

    1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...

  3. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  4. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  5. CSharp设计模式读书笔记(8):桥接模式(学习难度:★★★☆☆,使用频率:★★★☆☆)

    桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模 ...

  6. 《javascript设计模式》笔记之第八章:桥接模式

    个人理解:桥接模式就是更进一步地封装已有api,通过这个封装连接你的输入和底层api(初步理解,以后加深理解有不同体会之后可能要修改) 一:示例:事件监听器 下面这个示例就演示了通过一座桥(也就是一个 ...

  7. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

  8. 设计模式课程 设计模式精讲 18-2 迭代器模式coding

    1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...

  9. 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...

随机推荐

  1. 《实战Java高并发程序设计》读书笔记三

    第三章 JDK并发包 1.同步控制 重入锁:重入锁使用java.util.concurrent.locks.ReentrantLock类来实现,这种锁可以反复使用所以叫重入锁. 重入锁和synchro ...

  2. Abaqus脚本接口及简单应用

    目录 1.脚本接口简介 2. 宏录制 3. 宏回放 4. 宏编辑 5. 宏控制 1.脚本接口简介 Abaqus中的脚本接口(ASI)是在Python应用程序的基础上开发的,基于Abaqus中的脚本接口 ...

  3. JVM系列(三)之GC

    什么是GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄 ...

  4. cnpm - 解决 " cnpm : 无法加载文件 C:\Users\93457\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息 。。。 "

    1.在win10 系统中搜索框 输入 Windos PowerShell选择 管理员身份运行 2,打开了powershell命令行之后,输入 set-ExecutionPolicy RemoteSig ...

  5. mui 获取本地APP本版号的两种方式

    第一种 mui.plusReady(function () { mui.getJSON("manifest.json", null, function (data) { vum = ...

  6. 「HNOI2012」永无乡

    传送门 Luogu 解题思路 很容易想到平衡树,然后还可以顺便维护一下连通性,但是如何合并两棵平衡树? 我们采用一种类似于启发式合并的思想,将根节点siz较小的那颗平衡树暴力的合并到另一颗上去. 那么 ...

  7. 简单oracle查询语句转换为mongo查询语句

    可以将简单的单表查询语句转换成Mongo过滤条件 列: 1. db.demo.aggregate([ {"$match": {"$and": [{"p ...

  8. Flask - g变量

    传送门 http://flask.pocoo.org/docs/1.0/appcontext/#storing-data http://flask.pocoo.org/docs/1.0/appcont ...

  9. redis是单进程数据库,多用户排队对统一数据进行访问,不存在并发访问生产的线程安全问题

    redis是单进程数据库,多用户排队对统一数据进行访问,不存在并发访问生产的线程安全问题. oracle是多进程数据库,存在并发访问的问题,必须事务加锁等方式进行处理.

  10. WinForm开发(4)——使用Visual-Studio-2010-打包安装程序

    打包程序: 1,解决方案—右键菜单“添加”—新建项目—其他项目类型—安装和部署—Visual Studio Installer—安装项目,输入名称Setup1,点“确定” 2,添加开始程序中的文件夹: ...