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. The Preliminary Contest for ICPC Asia Xuzhou 2019 M. Longest subsequence(思维+序列自动机)

    序列自动机跑s串 假设k为s和t相同的长度,初始时相同长度为0 取s串中大于t[i]的最左边的位置,用n-tmp+1+i-1更新答案,tmp是最左端的位置 然后去t[i]相等的位置,走到下一位,如果下 ...

  2. 在linux下安装java(centos和ubuntu)

    在本地测试环境安装插件,发现还得用到java,虽说是个程序员,可是没用过java啊,哎,但是插件得用啊,怎么办啊?自己装呗 一.自己的系统:CentOS 7 1.查看CentOS自带JDK是否已安装. ...

  3. 树莓派下编译并使用miracl密码库

    参考:Linux下编译并使用miracl密码库 MIRACL用户手册:https://wenku.baidu.com/view/d542f2ed0975f46527d3e1dc.html 具体过程. ...

  4. 【PAT甲级】1085 Perfect Sequence (25 分)

    题意: 输入两个正整数N和P(N<=1e5,P<=1e9),接着输入N个正整数.输出一组数的最大个数使得其中最大的数不超过最小的数P倍. trick: 测试点5会爆int,因为P太大了.. ...

  5. WCF全面解析之 第四讲 使用代码 部署服务

    关键代码: ServiceHost host = null; //启动 private void button1_Click(object sender, EventArgs e) { host=ne ...

  6. Python - 协议和鸭子类型

    参考: Fluent_Python - P430 wiki 这里说的协议是什么?是让Python这种动态类型语言实现多态的方式. 在面向对象编程中,协议是非正式的接口,是一组方法,但只是一种文档,语言 ...

  7. Burpsuite 工具详解(常用模块之proxy、spider 、decoder)

    Burpsuite常用模块之proxy.spider .decoder                                                 是一款集成化渗透测试工具(jav ...

  8. Jmeter_请求原件之参数化txt

    把数据存放在TXT上进行参数化,然后运行 用于注册,登录等不同的用例 1.登录接口地址: http://test.lemonban.com/futureloan/mvc/api/member/logi ...

  9. java编译问题之Description Resource Path Location Type Java compiler level does not match the version of

    project 编译问题,需要三处的jdk版本要保持一致,才能编译通过. 1.在项目上右键properties->project Facets->修改右侧的version  保持一致 2. ...

  10. 【Javaweb】Servlet的xml和注解配置

    1.xml <%@ page language="java" contentType="text/html;" %> <!DOCTYPE ht ...