Riordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

引言: 多款安装了手机游戏和通讯录软件的不同种手机,怎去抽象出它的实现形式呢?有2种思路可循:

        (1) 按品牌抽象   手机品牌-->手机品牌X-->带有软件Y的手机品牌X

      (2)按软件抽象   手机软件-->手机软件Y--> 在手机品牌X上运行的手机软件Y

     由于实现的方式有多种,而且先抽象谁效率高不清楚(因为品牌和软件都很多,很难知道谁多谁少),这时,增加品牌或软件都需要增加很多类的开销,Bridge模式正好能很好地解决此问题。

Bridge模式(桥接模式):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

问题:你都让它独立变化了,那还怎么让它们产生关系?之前已经说过,类与类的关系,可以通过继承、包含或内嵌指针(引用)。这里可以运用第三种,通过带指针的形参使他们聚合。

实例:

View Code
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //**********手机软件线路************************
 5 class CHandsetSoft  
 6 {
 7 public:
 8     virtual void Run() = 0;
 9 };
10 
11 //手机游戏
12 class CHandsetGame :public CHandsetSoft
13 {
14 public:
15     virtual void Run()
16     {
17         cout<<"Running the HandsetGame..."<<endl;
18     }
19 };
20 
21 //通讯录
22 class CHandsetAddressList :public CHandsetSoft
23 {
24 public:
25     virtual void Run()
26     {
27         cout<<"Running the HandsetAddressList..."<<endl;
28     }
29 };
30 
31 //***********手机品牌***********************
32 class CHandsetBrand
33 {
34 public:
35     virtual SetHandsetSoft(CHandsetSoft *pHandsetSoft) = 0;
36 };
37 
38 //手机M品牌
39 class CHandsetBrandM :public CHandsetBrand
40 {
41 public:
42     virtual SetHandsetSoft(CHandsetSoft *pHandsetSoft) 
43     {
44         cout<<"HandsetBrandM was ";
45         pHandsetSoft->Run();
46     }
47 };
48 
49 //手机N品牌
50 class CHandsetBrandN :public CHandsetBrand
51 {
52 public:
53     virtual SetHandsetSoft(CHandsetSoft *pHandsetSoft) 
54     {
55         cout<<"HandsetBrandN was ";
56         pHandsetSoft->Run();    
57     }    
58 };
59 
60 //客户端
61 int main(int argc, char* argv[])
62 {
63     CHandsetGame HandsetGameObj;
64     CHandsetAddressList HandsetAddressListObj;
65 
66     CHandsetBrand *pHandsetBrandM = new CHandsetBrandM;
67      pHandsetBrandM->SetHandsetSoft(&HandsetGameObj);
68     pHandsetBrandM->SetHandsetSoft(&HandsetAddressListObj);
69 
70     CHandsetBrand *pHandsetBrandN = new CHandsetBrandN;
71     pHandsetBrandN->SetHandsetSoft(&HandsetGameObj);
72     pHandsetBrandN->SetHandsetSoft(&HandsetAddressListObj);
73     
74     delete pHandsetBrandM;
75     delete pHandsetBrandN;
76 
77     return 0;
78 }

小结: 这里运用了合成聚合原则,而这也是推荐的原则,通过形参实现这一原则。
优点:   (1)降低了沿着两个或多个维度扩展时的复杂度,防止类的过度膨胀。

           (2)解除了两个或多个维度之间的耦合,使它们沿着各自方向变化而不互相影响。

 

 

posted on 2013-05-02 22:42  Riordon  阅读(142)  评论(0)    收藏  举报