1    代码演练

1.1  代码演练1

1.2  代码演练2

 

1    代码演练
1.1  代码演练1

需求:

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

优点:

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

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

uml:

账号接口:

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

活期账号:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. public class SavingAccount implements Account{
  4.  
  5. @Override
  6. public Account openAccount() {
  7. System.out.println("打开活期账号");
  8. return new SavingAccount();
  9. }
  10.  
  11. @Override
  12. public void showAccount() {
  13. System.out.println("这是活期账号");
  14. }
  15. }

定期账号:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. public class DepositAccount implements Account {
  4. @Override
  5. public Account openAccount() {
  6. System.out.println("打开定期账号");
  7. return new DepositAccount();
  8. }
  9.  
  10. @Override
  11. public void showAccount() {
  12. System.out.println("这是一个定期账号");
  13. }
  14. }

银行接口:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. /**
  4. * 该类要写成一个抽象类,因为可能有农业银行,工商银行等银行继承该类
  5. */
  6. public abstract class Bank {
  7. /**
  8. * 声明子类,因为银行查看账号 需要引用到账号类
  9. */
  10. protected Account account;
  11.  
  12. /**
  13. * 通过构造方法注入银行账号
  14. */
  15. public Bank(Account account) {
  16. this.account = account;
  17. }
  18.  
  19. abstract Account openAccount();
  20. }

ABC银行:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. /**
  4. * 创建中国农业银行
  5. */
  6. public class ABCBank extends Bank{
  7.  
  8. public ABCBank(Account account) {
  9. super(account);
  10. }
  11.  
  12. @Override
  13. Account openAccount() {
  14. System.out.println("打开中国农业银行账号");
  15. return account;
  16. }
  17. }

爱存不存银行:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. public class ICBCBank extends Bank{
  4. public ICBCBank(Account account) {
  5. super(account);
  6. }
  7.  
  8. @Override
  9. Account openAccount() {
  10. System.out.println("打开中国工商银行");
  11. return account;
  12. }
  13. }

测试类:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. public class Test {
  4. public static void main(String [] args){
  5. Bank bank1 = new ICBCBank(new DepositAccount());
  6. Account account1 = bank1.openAccount();
  7. account1.showAccount();
  8.  
  9. Bank bank2 = new ICBCBank(new SavingAccount());
  10. Account account2 = bank2.openAccount();
  11. account2.showAccount();
  12.  
  13. Bank bank3 = new ABCBank(new DepositAccount());
  14. Account account3 = bank3.openAccount();
  15. account3.showAccount();
  16. }
  17. }

打印日志:

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

注意看:

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

UML类图:

ABCBank:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. /**
  4. * 创建中国农业银行
  5. */
  6. public class ABCBank extends Bank{
  7.  
  8. public ABCBank(Account account) {
  9. super(account);
  10. }
  11.  
  12. @Override
  13. Account openAccount() {
  14. account.openAccount();
  15. System.out.println("打开中国农业银行账号");
  16. return account;
  17. }
  18. }

爱存不存Bank:

  1. package com.geely.design.pattern.structural.bridge;
  2.  
  3. public class ICBCBank extends Bank{
  4. public ICBCBank(Account account) {
  5. super(account);
  6. }
  7.  
  8. @Override
  9. Account openAccount() {
  10. account.openAccount();
  11. System.out.println("打开中国工商银行");
  12. return account;
  13. }
  14. }

打印日志:

  1. 打开定期账号
  2. 打开中国工商银行
  3. 这是一个定期账号
  4. 打开活期账号
  5. 打开中国工商银行
  6. 这是活期账号
  7. 打开定期账号
  8. 打开中国农业银行账号
  9. 这是一个定期账号
  10.  
  11. 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. python requests.request 和session.request区别究竟在哪里

    import requests hd={"X-auth":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzeXN0ZW0iLCJBUEkiOiIvdW ...

  2. 不要在mutation回调函数之外,修改vuex仓库里属性的状态

    [vuex] do not mutate vuex store state outside mutation handlers. import * as types from './mutation- ...

  3. 攻防世界 web 进阶区 刷题记录

    1.Training-WWW-Robots 题目提示了robots协议,直接访问robots.txt 继续访问fl0g.php 2.baby_web 题目描述:想想初始页面是哪个 百度搜了下,inde ...

  4. 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)

    题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...

  5. Django安装数据库MySQLdb

    在使用Django搭建与树莓派智能终端时,使用mysql作为数据库管理,遇到如下问题: django.core.exceptions.ImproperlyConfigured: Error loadi ...

  6. windows和ubuntu安装以太坊客户端Mist

    Mist钱包下载地址:https://github.com/ethereum/mist/releases Mist = Ethereum Wallet + Web3 浏览器 Dapp:bancor 史 ...

  7. shell 脚本基础

    弱类型语言 bash 变量类型 本地变量 环境变量 局部变量 位置参数变量 特殊变量 运行 无执行权限 bash hello.sh 有执行权限 检查语法 bash -n user.sh 跟踪每一行的执 ...

  8. 比较器Comparable Comparator

    一. Comparable Comparable 是排序接口,若一个类实现了 Comparable 接口,就意味着该类支持排序.实现了Comparable 接口的类的对象的列表或者数组可以通过 Col ...

  9. JPA 级联保存的问题

    前提:系统有学校-学生关系,学校可以包含多个学生,学生只能属于一个学校 在使用 spring-data-jpa 的时候,保存学校的同时保存学生信息,不需要先逐个保存学生信息,再将学生信息放在学校中保存 ...

  10. CSS Sprite精灵图如何缩放大小

    transform:scale( x ): 语法为:transform: scale(x,y). 同时有scaleX, scaleY专门的x, y方向的控制. 例如:transform: scale( ...