0%

设计模式之桥模式

设计模式基础(5):桥模式

介绍桥模式的C++示例代码、面向的问题、图解桥模式核心思想

面向的需求

当某一类的功能呈现出多维度的变化趋势,将类拆分为多个方向,并采用组合的方式将功能联系在一起,改变常见的多继承形式

示例代码

采用桥模式之后的代码,多继承形式的代码不予展出,可参见后续的类图关系来理解。

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
class Messager{
protected:
MessagerImp* messagerImp;//...
public:
virtual void Login(string username, string password)=0;
virtual void SendMessage(string message)=0;
virtual void SendPicture(Image image)=0;

virtual ~Messager(){}
};

class MessagerImp{
public:
virtual void PlaySound()=0;
virtual void DrawShape()=0;
virtual void WriteText()=0;
virtual void Connect()=0;

virtual MessagerImp(){}
};

//平台实现 n
class PCMessagerImp : public MessagerImp{
public:

virtual void PlaySound(){
//**********
}
virtual void DrawShape(){
//**********
}
virtual void WriteText(){
//**********
}
virtual void Connect(){
//**********
}
};

class MobileMessagerImp : public MessagerImp{
public:

virtual void PlaySound(){
//==========
}
virtual void DrawShape(){
//==========
}
virtual void WriteText(){
//==========
}
virtual void Connect(){
//==========
}
};

//业务抽象 m

//类的数目:1+n+m

class MessagerLite :public Messager {


public:

virtual void Login(string username, string password){

messagerImp->Connect();
//........
}
virtual void SendMessage(string message){

messagerImp->WriteText();
//........
}
virtual void SendPicture(Image image){

messagerImp->DrawShape();
//........
}
};

class MessagerPerfect :public Messager {


public:

virtual void Login(string username, string password){

messagerImp->PlaySound();
//********
messagerImp->Connect();
//........
}
virtual void SendMessage(string message){

messagerImp->PlaySound();
//********
messagerImp->WriteText();
//........
}
virtual void SendPicture(Image image){

messagerImp->PlaySound();
//********
messagerImp->DrawShape();
//........
}
};

void Process(){
//运行时装配
MessagerImp* mImp=new PCMessagerImp();
Messager *m =new Messager(mImp);
}

代码思想分析

类图关系

  • 多继承形式
    多继承

  • 重构为桥模式
    桥模式

思想方法

对原有的类的功能进行区分,当判别到其变化维度并不一致时,可分割功能类型。将抽象部分(业务部分)与实现部分(平台实现)分离,使它们都可以独立的变化。

  • 抽象类图
    抽象类图

关键点

  • 桥模式一般用于“两个非常强的变化维度”,也可能用于多于两个的维度。但关键思想在于拆分不同变化方向,组合其整体功能,最终目标实现运行时装配。

注:桥模式和装饰模式有很相似的地方,比如都是采用了继承转组合的思想,都是涉及到职责的确定。哪两者的区别在哪呢?

  • 其重构过程中,桥模式是已经有了诸多功能,但是功能具体化的方向不确定,重在明确变化方向,拆分。
  • 装饰模式中是在不停的拓展新的功能,在拓展中明确操作的抽象性,重点是提取新操作面向的抽象类。