设计模式课程 设计模式精讲 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 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...
随机推荐
- Django--模型管理器
参考https://blog.csdn.net/qq_34788903/article/details/87889451 可参考视频 : https://www.bilibili.com/video ...
- [C++_QT] Error: Not a signal or slot declaration
问题: 在Qt工程中添加了一个新的窗口之后 一直报错 如下 单单从错误描述上看 是缺少信号或者槽 但是我确定没有缺少啊 然后第二个错误显示了一个mox_xxxx文件 然后我就去那个目录下去找那个文件 ...
- 7,请描述下cookies,sessionStorage和localStorage的区别
7,请描述下cookies,sessionStorage和localStorage的区别 首先,cookie是网站为了标识用户身份而储存在用户本地终端(client side,百科: 本地终端指与计算 ...
- js函数声明外面使用小括号括起来再接一个小括号的写法
js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...
- disconf---分布式配置管理平台的搭建(linux版本)
一.获取disconf的代码 地址:https://github.com/knightliao/disconf 二.搭建基础服务 ①redis,mysql,zookeeper在博主的其他博文中有相应搭 ...
- 关于overflow:hidden的作用(溢出隐藏,清除浮动,解决外边塌陷等等)
1.overflow:hidden 溢出隐藏 给一个元素中设置overflow:hidden ,那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏,不占位. 代码如下: 运行结果 ...
- Vue-状态管理Vuex的使用
vuex是状态管理,是为了解决跨组件之间数据共享问题的,一个组件的数据变化会映射到使用这个数据的其他组件当中.如果刷新页面,之前存储的vuex数据全部都会被初始化掉.以一个全局单例模式管理当应用遇到多 ...
- html5的元素拖拽
今天学习了妙味课堂的课程: 在html5中有支持元素拖拽的一些属性和方法: 一些实例代码如下: <div id="div1"></div> <ul&g ...
- 详解mysql中的Using与On的用法
多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立 ...
- Web Storage API:localStorage 和 SessionStorage
Web Storage API 提供了存储机制,通过该机制,浏览器可以安全地存储键值对,比使用 cookie 更加直观. 参考:https://developer.mozilla.org/zh-CN/ ...