设计模式基础(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(){} };
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(){ } };
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); }
|
代码思想分析
类图关系
多继承形式
重构为桥模式
思想方法
对原有的类的功能进行区分,当判别到其变化维度并不一致时,可分割功能类型。将抽象部分(业务部分)与实现部分(平台实现)分离,使它们都可以独立的变化。
- 抽象类图
关键点
- 桥模式一般用于“两个非常强的变化维度”,也可能用于多于两个的维度。但关键思想在于拆分不同变化方向,组合其整体功能,最终目标实现运行时装配。
注:桥模式和装饰模式有很相似的地方,比如都是采用了继承转组合的思想,都是涉及到职责的确定。哪两者的区别在哪呢?
- 其重构过程中,桥模式是已经有了诸多功能,但是功能具体化的方向不确定,重在明确变化方向,拆分。
- 装饰模式中是在不停的拓展新的功能,在拓展中明确操作的抽象性,重点是提取新操作面向的抽象类。