【设计模式-桥接模式】
时间:2022-07-24
本文章向大家介绍【设计模式-桥接模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【导读】现实中有很多是可以组合使用的,例如A有两种产品,B有三种产品,那么A和B可以有六种组合,类似于笛卡尔积。这就是桥接模式。
一、定义
将抽象部分与它的具体实现部分分离,使他们都可以独立变化。通过组合的方式建立两个类之间的联系,而不是继承。
比如组装电脑需要内存卡和主板,内存卡有三星、闪迪,主板有技嘉和华硕,那么此电脑组合有下列几种方式:
三星 |
闪迪 |
|
---|---|---|
技嘉 |
三星 X 技嘉 |
闪迪 X 技嘉 |
华硕 |
三星 X 华硕 |
闪迪 X 华硕 |
二、示例 以银行卡为例,银行有中国银行、中国工商银行,存储方式有活期存储和定期存储两种方式。
抽象账号对象:
public interface Account {
public Account openAccount();
public void getAccountType();
}
活期存储账号:
public class CurrentAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开一个活期账号");
return new CurrentAccount();
}
@Override
public void getAccountType() {
System.out.println("这是一个活期账号");
}
}
定期存储账号:
public class FixAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开一个定期账号");
return new FixAccount();
}
@Override
public void getAccountType() {
System.out.println("这是一个定期账号");
}
}
抽象银行对象:
public abstract class Bank {
1、包含一个账号属性
protected Account account;
public Bank(Account account) {
this.account = account;
}
Account openAccount(){
return account;
};
}
工商银行对象:
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行的账号");
account.openAccount();
return account;
}
}
中国银行对象:
public class BOCBank extends Bank {
public BOCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国银行的账号");
account.openAccount();
return account;
}
}
测试类:只需要确定是什么银行以及什么账号
Bank bank = new BOCBank(new FixAccount());
Account account = bank.openAccount();
account.getAccountType();
运行结果:
看一下它们的类图:
两种不同的对象是以组合的形式存在,这样有利于扩展。
三、源码实例
(1)JDBC的DriverManager和DriverInfo
可以加在多种驱动
类加载的时候会将驱动进行加载至registeredDrivers列表中
- linux学习第五十九篇:LVS DR模式搭建,keepalived lvs
- linux学习第五十四篇:配置Tomcat监听80端口,配置Tomcat的虚拟主机,Tomcat日志
- linux学习第五十六篇:集群介绍,keepalived介绍,用keepalived配置高可用集群
- linux学习第五十八篇: 负载均衡集群介绍,LVS介绍,LVS的调度算法,LVS NAT模式搭建
- Python中eval带来的潜在风险,你知道吗?
- React Native自定义导航条
- android混淆那些坑
- 微信小程序开发入门篇
- Support Annotation Library使用详解
- React Native之Navigator
- React Native组件生命周期
- React Native使用原生组件
- Android ViewDragHelper及移动处理总结
- android 仿音悦台页面交互效果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法