设计模式课程 设计模式精讲 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 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...
随机推荐
- python requests.request 和session.request区别究竟在哪里
import requests hd={"X-auth":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJzeXN0ZW0iLCJBUEkiOiIvdW ...
- 不要在mutation回调函数之外,修改vuex仓库里属性的状态
[vuex] do not mutate vuex store state outside mutation handlers. import * as types from './mutation- ...
- 攻防世界 web 进阶区 刷题记录
1.Training-WWW-Robots 题目提示了robots协议,直接访问robots.txt 继续访问fl0g.php 2.baby_web 题目描述:想想初始页面是哪个 百度搜了下,inde ...
- 2019牛客暑期多校训练营(第十场) Han Xin and His Troop (高精度+拓展中国剩余定理)
题意 裸题 思路 题中的模数之间并不互质,所以应该用拓展中国剩余定理. 但是交上去会炸,__int128过不了,所以用高精度的板子或者java大数都挺好过的. 这里推荐java大数,因为高精度板子用起 ...
- Django安装数据库MySQLdb
在使用Django搭建与树莓派智能终端时,使用mysql作为数据库管理,遇到如下问题: django.core.exceptions.ImproperlyConfigured: Error loadi ...
- windows和ubuntu安装以太坊客户端Mist
Mist钱包下载地址:https://github.com/ethereum/mist/releases Mist = Ethereum Wallet + Web3 浏览器 Dapp:bancor 史 ...
- shell 脚本基础
弱类型语言 bash 变量类型 本地变量 环境变量 局部变量 位置参数变量 特殊变量 运行 无执行权限 bash hello.sh 有执行权限 检查语法 bash -n user.sh 跟踪每一行的执 ...
- 比较器Comparable Comparator
一. Comparable Comparable 是排序接口,若一个类实现了 Comparable 接口,就意味着该类支持排序.实现了Comparable 接口的类的对象的列表或者数组可以通过 Col ...
- JPA 级联保存的问题
前提:系统有学校-学生关系,学校可以包含多个学生,学生只能属于一个学校 在使用 spring-data-jpa 的时候,保存学校的同时保存学生信息,不需要先逐个保存学生信息,再将学生信息放在学校中保存 ...
- CSS Sprite精灵图如何缩放大小
transform:scale( x ): 语法为:transform: scale(x,y). 同时有scaleX, scaleY专门的x, y方向的控制. 例如:transform: scale( ...