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. eclipse配置class注释模板

    /** * Copyright (c) ${year}, All Rights Reserved. * */ ${filecomment} ${package_declaration} ${typec ...

  2. Groovy脚本-通用SQL开关

    备注:使用Groovy语言进行编写,看不懂的同学请先了解Groovy脚本. Groovy学习地址:https://www.cnblogs.com/tiechui2015/p/10828457.html ...

  3. LVS+Keepalived -----> 效率最高的负载均衡器

    一. 简介  1. 负载均衡的类型  负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载 软件负 ...

  4. CSS3实现魔方动画

    本文将借助css3实现魔方动画效果,设计思路如下: HTML方面采用六个div容器形成六个立方面: CSS方面采用transform-style: preserve-3d;形成三维场景:transfo ...

  5. ASP.NET Core搭建多层网站架构【14-扩展之部署到IIS】

    2020/02/03, ASP.NET Core 3.1, VS2019, IIS 10, dotnet-hosting-3.1.1-win.exe 摘要:基于ASP.NET Core 3.1 Web ...

  6. Django框架之图书管理系统(一)

    图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作 ============================================= ...

  7. Java面向对象简单知识总结-考试用

    类.对象.构造器 类定义了属性.方法,是抽象的,写在扩展名为java的文件中. 对象是类的实体,是具体的. 构造器:方法名与类名一致.没有返回类型,可以重载不能重写.在创建对象时调用.使用new调用实 ...

  8. 计划任务cron,date,时间同步ntp,chrony

    取出磁盘利用率最大值 ,写个脚本,做判断,只要快满了,就报警 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业  /etc/crontab 用户cron任务: ...

  9. Nginx 七层反向代理

    目录 1.代理 2.正向代理 3.反向代理 4.Nginx 反向代理 5.Nginx 反向代理相关指令介绍 ①.listen ②.server_name ③.location ④.proxy_pass ...

  10. T4 多文件生成说明

    1.安装T4,自动生成文件 Manager.ttinclude <#@ assembly name="System.Core"#> <#@ assembly na ...