设计模式笔记:桥接模式

概述

桥接模式是一种结构型设计模式,它主要解决的是多继承的问题,它增强了系统的可扩展性,并对抽象部分和实现部分进行了分离。

示例

以一个简单的电视和遥控器的例子来具体实现和解释桥接模式。假设我们有多种类型的电视和多种类型的遥控器,我们可以使用桥接模式来将他们组合在一起,而不是为每种电视和遥控器都创建一个具体的类。

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
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>

// 实现部分
class TV {
public:
virtual void on() = 0;
virtual void off() = 0;
};

class SonyTV : public TV {
public:
void on() override {
std::cout << "Sony TV is on\n";
}

void off() override {
std::cout << "Sony TV is off\n";
}
};

class SamsungTV : public TV {
public:
void on() override {
std::cout << "Samsung TV is on\n";
}

void off() override {
std::cout << "Samsung TV is off\n";
}
};

// 抽象部分
class RemoteControl {
protected:
TV* tv; // 要桥接的电视对象

public:
RemoteControl(TV* tv) : tv(tv) {} // 要桥接的对象通过构造函数参数传递
virtual void turnOn() {
tv->on();
}
virtual void turnOff() {
tv->off();
}
};

class AdvancedRemoteControl : public RemoteControl {
public:
AdvancedRemoteControl(TV* tv) : RemoteControl(tv) {}
void setChannel(int channel) {
std::cout << "Advanced remote set channel to " << channel << std::endl;
}
};

int main() {
TV* tv1 = new SonyTV();
RemoteControl* remote1 = new RemoteControl(tv1);
remote1->turnOn();
remote1->turnOff();

TV* tv2 = new SamsungTV();
AdvancedRemoteControl* remote2 = new AdvancedRemoteControl(tv2);
remote2->turnOn();
remote2->setChannel(5);
remote2->turnOff();

delete remote1;
delete tv1;
delete remote2;
delete tv2;

return 0;
}

总结:

在这个例子中,首先定义了一个TV接口,它是我们实现部分的一部分。然后我们为Sony和Samsung电视创建了具体的类。

接着,我们定义了一个RemoteControl类,它是我们抽象部分的一部分。这个类有一个TV类型的成员变量,这就是我们的桥接。

我们还定义了一个AdvancedRemoteControl类,它继承了RemoteControl类,并添加了一个新的方法setChannel。

在main函数中,我们创建了一个SonyTV对象和一个RemoteControl对象,然后使用RemoteControl对象来控制SonyTV对象。我们也创建了一个SamsungTV对象和一个AdvancedRemoteControl对象,并使用AdvancedRemoteControl对象来控制SamsungTV对象。

这样,就可以在不改变RemoteControl类和TV类的情况下,将任意类型的遥控器和电视组合在一起。这就是桥接模式的主要优点。

补充更新

桥接模式:有多个独立变换的维度时,将抽象部分与实现部分分离开来,使它们都可以独立的变化。

举例:Computer基类 的 成员函数void InstallOS(OS *os),入参为OS基类