设计模式课程 设计模式精讲 15-2 桥接模式Coding
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的更多相关文章
- 设计模式课程 设计模式精讲 13-2 享元模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- CSharp设计模式读书笔记(8):桥接模式(学习难度:★★★☆☆,使用频率:★★★☆☆)
桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模 ...
- 《javascript设计模式》笔记之第八章:桥接模式
个人理解:桥接模式就是更进一步地封装已有api,通过这个封装连接你的输入和底层api(初步理解,以后加深理解有不同体会之后可能要修改) 一:示例:事件监听器 下面这个示例就演示了通过一座桥(也就是一个 ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
- 设计模式课程 设计模式精讲 18-2 迭代器模式coding
1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...
- 设计模式课程 设计模式精讲 5-2 工厂方法coding
1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...
随机推荐
- eclipse配置class注释模板
/** * Copyright (c) ${year}, All Rights Reserved. * */ ${filecomment} ${package_declaration} ${typec ...
- Groovy脚本-通用SQL开关
备注:使用Groovy语言进行编写,看不懂的同学请先了解Groovy脚本. Groovy学习地址:https://www.cnblogs.com/tiechui2015/p/10828457.html ...
- LVS+Keepalived -----> 效率最高的负载均衡器
一. 简介 1. 负载均衡的类型 负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载 软件负 ...
- CSS3实现魔方动画
本文将借助css3实现魔方动画效果,设计思路如下: HTML方面采用六个div容器形成六个立方面: CSS方面采用transform-style: preserve-3d;形成三维场景:transfo ...
- 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 ...
- Django框架之图书管理系统(一)
图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作 ============================================= ...
- Java面向对象简单知识总结-考试用
类.对象.构造器 类定义了属性.方法,是抽象的,写在扩展名为java的文件中. 对象是类的实体,是具体的. 构造器:方法名与类名一致.没有返回类型,可以重载不能重写.在创建对象时调用.使用new调用实 ...
- 计划任务cron,date,时间同步ntp,chrony
取出磁盘利用率最大值 ,写个脚本,做判断,只要快满了,就报警 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业 /etc/crontab 用户cron任务: ...
- Nginx 七层反向代理
目录 1.代理 2.正向代理 3.反向代理 4.Nginx 反向代理 5.Nginx 反向代理相关指令介绍 ①.listen ②.server_name ③.location ④.proxy_pass ...
- T4 多文件生成说明
1.安装T4,自动生成文件 Manager.ttinclude <#@ assembly name="System.Core"#> <#@ assembly na ...