场景
- 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?如图:
可以使用多层继承结构实现上图的关系,但存在以下问题: - 扩展性问题(类个数膨胀问题):
- 如果要增加一个新的电脑类型:智能手机,则要增加各个品牌下面的类
- 如果要增加一个新的品牌,也要增加各种电脑类型的类
- 违反单一职责原则:
- 一个类:联想笔记本,有两个引起这个类变化的原因
在这个场景下有两个变化的维度:电脑类型、电脑品牌
此时,可以将这个两个维度分开,根据维度分别构成类继承结构,并关联这个两个维度的类
核心要点
- 处理多层继承结构,处理多维度变换的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
案例
/**
* 品牌
* @author huangyzh
* @create 2020-05-17 16:06
*/
public interface Brand {
void sale();
}
/**
* 电脑类型的维度
* @author huangyzh
* @create 2020-05-17 16:08
*/
public abstract class Computer2 {
protected Brand brand;
public Computer2(Brand brand) {
this.brand = brand;
}
public void sale(){
brand.sale();
}
}
/**
* @author huangyzh
* @create 2020-05-17 16:10
*/
public class Desktop2 extends Computer2 {
public Desktop2(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("销售台式机");
}
}
/**
* @author huangyzh
* @create 2020-05-17 16:11
*/
public class Laptop2 extends Computer2 {
public Laptop2(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("销售笔记本");
}
}
/**
* @author huangyzh
* @create 2020-05-17 16:07
*/
public class Lenovo implements Brand {
@Override
public void sale() {
System.out.println("销售lenovo电脑");
}
}
/**
* @author huangyzh
* @create 2020-05-17 16:08
*/
public class Dell implements Brand {
@Override
public void sale() {
System.out.println("销售Dell电脑");
}
}
/**
* @author huangyzh
* @create 2020-05-17 16:12
*/
public class Test01 {
public static void main(String[] args) {
//销售lenovo笔记本电脑
Computer2 c = new Laptop2(new Lenovo());
c.sale();
}
}
桥接模式案例图:
应用场景
- JDBC驱动程序
- AWT中的Peer架构
- 银行日志管理:
- 格式分类:操作日志、交易日志、异常日志
- 距离分类:本地记录日志、异地记录日志
- 人类资源系统中的奖金计算模块:
- 奖金分类:个人奖金、团队奖金、激励奖金
- 部门分类:人事部门、销售部门、研发部门
- OA系统中的消息处理:
- 业务类型:普通消息、加急消息、特急消息
- 发生消息方式:系统内消息、短信、邮件
总结
- 桥接模式可以取代多层继承的方案。多层继承违背了单一职责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的个数,从而降低管理和维护的成本。
- 桥接模式极大的提高了系统可扩展性,在两个变换维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。