场景
- 商城系统中常见的商品分类,以电脑为类,如何良好的处理商品分类销售的问题?
如图所示,我们的电脑有很多的品牌,如联想,戴尔等。同时,我们的电脑有很多的品类,如台式机,笔记本,平板电脑等。那么,我们组合展示电脑的时候,我们一般会使用多层继承结构实现图中关系: 
1  | package com.kid.bridge;  | 
一件商品的展示,我们需要耗费很大的时间。就有如下问题发生:
- 扩展性问题:
- 如果要增加一个新的电脑类型,平板电脑,则要怎加各个品牌下面的类。
 - 如果要增加一个新的品牌,也要增加各种电脑类型的类。
 
 - 违反单一职责原则:
- 一个类:联想笔记本,有两个引起这个类变化的原因
 
 
场景分析
- 这个场景中有两个变化的维度:电脑类型、电脑品牌。那么,我们可以建立两个不同的维度,通过某些连接,使其两两不同组合。– > 桥接模式
 
桥接模式的核心要点
- 处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
 
代码解析
我们先建造电脑品牌维度1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/**
 * 电脑品牌维度
 */
public interface Brand {
    void sale();
}
class Lenovo implements Brand{
    
    public void sale() {
        System.out.println("销售联想电脑");
    }
}
class Dell implements Brand{
    
    public void sale() {
        System.out.println("销售戴尔电脑");
    }
}
再建造电脑类型维度1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41/**
 * 电脑类型维度
 */
public class Computer2 {
    protected Brand brand;
    public Computer2(Brand brand) {
        this.brand = brand;
    }
    public void sale(){
        brand.sale();
    }
}
class Desktop2 extends Computer2{
    public Desktop2(Brand brand) {
        super(brand);
    }
    
    public void sale() {
        super.sale();
        System.out.println("销售台式机");
    }
}
class Laptop2 extends Computer2{
    public Laptop2(Brand brand) {
        super(brand);
    }
    
    public void sale() {
        super.sale();
        System.out.println("销售笔记本");
    }
}
调用:1
2
3
4
5
6
7
8
9
10/**
 * 桥接模式
 */
public class Client {
    public static void main(String[] args) {
        //销售联想笔记本电脑
        Computer2 c = new Laptop2(new Lenovo());
        c.sale();
    }
}
这样,我们就很轻松的实现业务需求。即使增加新的品类或者品牌。也只需要增加部分代码就可以,而无需改动太多。
桥接模式实际开发中应用场景
- JDBC驱动程序
 - AWT中的Peer架构
 
注:该博文为学习总结,视频来源为高淇java300集