一.桥接模式核心要点
- 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。 \color{red}{处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。} 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关系。
二.桥接模式实际开发中应用的场景
- JDBC驱动程序
- OA系统中的消息处理:
- 业务消息:普通消息、加急消息、特急消息
- 发送消息方式:系统内消息、手机短信、邮件
- 银行日志管理
- 格式分类: 操作日志、交易日志、异常日志
- 距离分类:本地记录日志、异地记录日志
三.桥接模式举例讲解
1.业务:
- 商城系统中常见的商品分类,以电脑为例,电脑类型分为台式电脑、平板电脑、笔记本电脑,电脑品牌分为华硕、戴尔、联想等等,具体类型可能是'华硕台式电脑',这个业务存在两个维度变化,那么如何良好的处理商品分类销售的问题?
2.不使用桥接模式:
- 我们可以使用多继承结构实现,这个时候存在两个维度变化,就会形成笛卡尔积。
- 类个数膨胀问题:
- 如果要增加一个新的电脑类型,则要增加各个品牌下面的类;
- 如果要增加一个品牌,也要增加各种电脑类型的类。
- 违法单一职责原则:
- 一个类,联想笔记本,有两个引起这个类变化的因素,违法单一职责原则
- 类个数膨胀问题:
3.桥接模式实现:
-
(1)电脑类型接口与实现类型
java
/**
* 电脑类型
*/
public interface Computer {
String getTypeName();
}
public class Laptop implements Computer{
@Override
public String getTypeName() {
return "笔记本电脑";
}
}
public class Desktop implements Computer{
@Override
public String getTypeName() {
return "台式电脑";
}
}
/**
* 可以随意添加,不会影响其他类
*/
/*public class Aad implements Computer{
@Override
public String getTypeName() {
return "平板电脑";
}
}*/
-
(2)电脑品牌抽象类与实现类
java
/**
* 品牌
*/
public abstract class Brand {
Computer computer;
public Brand(Computer computer) {
this.computer = computer;
}
public abstract String getBrand();
public void operation() {
System.out.println(getBrand()+computer.getTypeName());
}
}
/**
* 华硕电脑
*/
public class ASUS extends Brand{
public ASUS(Computer computer) {
super(computer);
}
@Override
public String getBrand() {
return "华硕";
}
}
/**
* 戴尔电脑
*/
public class Dell extends Brand{
public Dell(Computer computer) {
super(computer);
}
@Override
public String getBrand() {
return "戴尔";
}
}
/**
* 联想电脑
*/
public class Lenovo extends Brand{
public Lenovo(Computer computer) {
super(computer);
}
@Override
public String getBrand() {
return "联想";
}
}
/**
* 可以随意添加,不会影响其他类
*/
/*public class Shenzhou extends Brand{
public Shenzhou(Computer computer) {
super(computer);
}
@Override
public String getBrand() {
return "神州";
}
}*/
-
(3)桥接模式调用
java
/**
* 桥接模式:可以取代多层继承的方案!
*
*/
public class App {
public static void main(String[] args) {
Brand c = new Dell(new Desktop());
c.operation();
}
}
四.桥接模式总结:
- 桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。 \color{red}{桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。} 桥接模式可以取代多层继承关系。多层继承关系违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
- 桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。 \color{red}{桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。} 桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。
更多设计模式学习:
设计模式持续更新中...