Post

设计模式系列-桥接模式

首先介绍下类的功能层次和类的实现层次: 类的功能层次是指,对类进行继承后进行的功能拓展,例如Car(车类),所有车都有启动和停止方法以及转弯等方法,但是现在我有一个特殊的车需要在Car车类的基础上加一个倒车影像功能,此时只需要继承Car类再自己的类中加一个倒车影像的方法即可。 类的实现层次是指,对类只进行继承和方法实现,而不新增方法。比如不同的车都有鸣笛功能,但是鸣笛方式需要不同车来实现。

桥接模式适用于这样一种场景:有一个父类汽车,然后还有多个汽车品牌如宝马、奔驰、奥迪,每个品牌都有品牌信息,这是类的实现层次;同时每个品牌的车都会有有跑车、轿车、SUV三种品类,每种品类的汽车又有不同的功能,比如敞篷、越野等,这又是类的实现层次。这种情况下新增一个汽车品牌要增加该车对应的三个类,非常复杂。 桥接模式是用于将类的功能层次与类的结构层次分离,其中所涉及的角色为:

  • 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
  • 修正抽象化(RefinedAbstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
  • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
  • 具体实现化(ConcreteImplementor)角色:这个角色给出实现化角色接口的具体实现。

说人话就是, 让修正抽象化角色在继承中通过增加方法实现功能层次,同时抽象化角色保持一个对实现化对象的引用;而具体实现化对象在继承中通过实现抽象方法完成实现层次的内容。通过这种组合将两种层次进行了桥接,减少了类的数目。

代码如下:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 抽象化角色:品牌
public interface Brand{
    /**
    * 品牌信息
    */
   void info();
}

public class BMW implements Brand{
    
    @override
    public void info(){
        System.out.print("宝马");
    }
}

public class Audi implements Brand{
    
    @override
    public void info(){
        System.out.print("奥迪");
    }
}

public abstract class Car{

    protected Brand brand;

    public Car(Brand brand){
        this.brand = brand;
    }

    public void info(){
        brand.info();
    }
}

public class SportsCar extends Car{
    public SportsCar(Brand brand){
        super(brand);
    }

    @Override
    public void info(){
        super.info();
        System.out.println("跑车");
    }

    public void convertile(){
        System.out.println("打开敞篷");
    }
}

// 测试
public class Test{
    public static void main(String[] args){
        Car car = new SportsCar(new BWM());
        car.info();
    }
}

参考: https://cloud.tencent.com/developer/article/1895612 https://zhuanlan.zhihu.com/p/58903776

This post is licensed under CC BY 4.0 by the author.