抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

单一职责:桥模式。

模式类型

单一职责

桥模式

由于某些类型的固有实现逻辑,使他具有多个维度的变化。

将抽象部分(业务功能)与实现部分(平台实现)分离,使他们都可以独立地变化。

使用场景

与装饰模式类似,不过接口进行了拆分,将业务功能和平台实现进行了接口的拆分。

桥模式中的桥可以看作是 Messager 基类中的那个指向 MessagerImp 的指针,将二者组合起来,而不是继承。

以下例子为一个具有一个维度的变化。如果具有多个维度的变化,则需要多个指向基类的指针来充当“桥”组合各个基类。

与装饰模式作为对比,桥模式是主要区别是进行了接口的拆分。

举例

不使用桥模式

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
74
75
76
77
78
79
class Messager
{
public:
virtual void login() = 0;
virtual void send_message() = 0;
virtual void send_picture() = 0;

virtual void play_sound() = 0;
virtual void draw_shape() = 0;
virtual void write_text() = 0;
virtual void connect() = 0;

virtual ~Messager() {}
};

// PC 平台
class PCMessagerBase : public Messager
{
virtual void play_sound() { ... }
virtual void draw_shape() { ... }
virtual void write_text() { ... }
virtual void connect() { ... }
};

// 移动平台
class MobileMessagerBase: public Messager
{
virtual void play_sound() { ... }
virtual void draw_shape() { ... }
virtual void write_text() { ... }
virtual void connect() { ... }
};

// PC 平台添加功能
class PCMessagerLite : public PCMessagerBase
{
virtual void login()
{
PCMessagerBase::connect();
// ...
}
virtual void send_message()
{
PCMessagerBase::write_text();
// ...
}
virtual void send_picture()
{
PCMessagerBase::play_sound();
PCMessagerBase::draw_shape();
// ...
}
}

// 移动平台添加功能
class MobileMessagerLite : public MobileMessagerBase
{
virtual void login()
{
MobileMessagerBase::connect();
// ...
}
virtual void send_message()
{
MobileMessagerBase::write_text();
// ...
}
virtual void send_picture()
{
MobileMessagerBase::play_sound();
MobileMessagerBase::draw_shape();
// ...
}
}

void process()
{
MobileMessagerLite *m = new MobileMessagerLite();
}

使用桥模式

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
74
75
// 对原本的 Messager 接口隔离
class Messager
{
// 组合,而不是继承
MessagerImp* messagerImp;
public:
Messager(Messager* m): messagerImp(m) { }

virtual void login() = 0;
virtual void send_message() = 0;
virtual void send_picture() = 0;

virtual ~Messager() {}
};

class MessagerImp
{
public:
virtual void play_sound() = 0;
virtual void draw_shape() = 0;
virtual void write_text() = 0;
virtual void connect() = 0;

virtual ~MessagerImp() {}
};

// PC 平台
class PCMessagerImp : public MessagerImp
{
virtual void play_sound() { ... }
virtual void draw_shape() { ... }
virtual void write_text() { ... }
virtual void connect() { ... }
};

// 移动平台
class MobileMessagerImp: public MessagerImp
{
virtual void play_sound() { ... }
virtual void draw_shape() { ... }
virtual void write_text() { ... }
virtual void connect() { ... }
};

// PC 平台、移动平台添加功能
// 添加的功能一致。因此和装饰模式一样
class MessagerLite : public Messager
{
// 初始化
MessagerLite(MessagerImp* m): messagerImp(m) { }

virtual void login()
{
messagerImp->connect();
// ...
}
virtual void send_message()
{
messagerImp->write_text();
// ...
}
virtual void send_picture()
{
messagerImp->play_sound();
messagerImp->draw_shape();
// ...
}
};


void process()
{
MessagerImp *pcMessagerImp = new PCMessagerImp();
MessagerLite *ml = new MessagerLite(pcMessagerImp);
}