设计模式之bridge模式之(2)

来源:互联网 发布:linux进入文件夹 编辑:程序博客网 时间:2024/05/17 01:55

 今天回头看了原来写的bridge模式的文章,感觉还是太泛化、理论,不能够方便快速的理解,下面就借这《大话设计模式》中有关bridge模式的解释来谈谈实际实际应用解决的问题。

手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。如果我们单独以手机品牌或手机软件为基类来进行继承扩展的话,无疑会使类的数目剧增并且耦合性很高,(如果更改品牌或增加软件都会增加很多的变动)两种方式的结构如下:

 

所以将两者抽象出来两个基类分别是PhoneBrand和PhoneSoft,那么在品牌类中聚合一个软件对象的基类将解决软件和手机扩展混乱的问题,这样两者的扩展就相对灵活,剪短了两者的必要联系,结构图如下:

这样扩展品牌和软件就相对灵活独立,达到解耦的目的!

个人认为此模式重点实现是在手机品牌上,示例代码可能如下更合理

view plain
  1. /// >虚拟软件基类  
  2. class PhoneSoft  
  3. {  
  4. public:  
  5.     PhoneSoft();  
  6.     virtual void runSoft();  
  7.     /// ....   
  8. };  
  9.   
  10. /// >通讯录子类  
  11. class PhoneSoftBook : public PhoneSoft  
  12. {  
  13. public:  
  14.     PhoneSoftBook();  
  15.     virtual void runSoft(){ cout << "book soft run!";}  
  16. };  
  17.   
  18. /// >mp3子类  
  19. class PhoneSoftMp3 : public PhoneSoft  
  20. {  
  21. public:  
  22.     PhoneSoftMp3();  
  23.     virtual void runSoft(){ cout << "mp3 soft run!";}  
  24. };  
  25.   
  26. ///// > 其他soft子类  
  27.   
  28.   
  29. class PhoneBrand  
  30. {  
  31. public :  
  32.     void addNewSoft(PhoneSoft * soft){ m_softs.append(soft);}  
  33.     void runAllSoft()  
  34.     {  
  35.         foreach(PhoneSoft*item, m_softs)  
  36.         {  
  37.             item->runSoft();  
  38.         }  
  39.     }  
  40. private:  
  41.     QList<PhoneSoft*> m_softs;  
  42. };  
  43.   
  44. class PhoneBrand_A : public PhoneBrand  
  45. {  
  46. public:  
  47.     PhoneBrand_A();  
  48. };  
  49.   
  50.   
  51. class PhoneBrand_B : public PhoneBrand  
  52. {  
  53. public:  
  54.     PhoneBrand_B();  
  55. };  
  56.   
  57. void main()  
  58. {  
  59.     /// >创建通讯录  
  60.     PhoneSoft * soft = new PhoneSoftBook;  
  61.       
  62.     /// A品牌手机添加通讯录软件  
  63.     PhoneBrand_A *aBrand = new PhoneBrand_A;  
  64.     aBrand->addNewSoft(soft);  
  65.       
  66.     /// A品牌手机添加软件mp3  
  67.     soft = new PhoneSoftMp3;  
  68.     aBrand->addNewSoft(soft);  
  69.       
  70.     /// B品牌手机添加通讯录软件  
  71.     soft = new PhoneSoftBook;  
  72.     PhoneBrand_B *bBrand = new PhoneBrand_B;  
  73.     bBrand->addNewSoft(soft);  
  74.       
  75.     /// B品牌手机添加软件mp3  
  76.     soft = new PhoneSoftMp3;  
  77.     bBrand->addNewSoft(soft);  
  78. }  
原创粉丝点击