今天回头看了原来写的bridge模式的文章,感觉还是太泛化、理论,不能够方便快速的理解,下面就借这《大话设计模式》中有关bridge模式的解释来谈谈实际实际应用解决的问题。
手机品牌和软件是两个概念,不同的软件可以在不同的手机上,不同的手机可以有相同的软件,两者都具有很大的变动性。如果我们单独以手机品牌或手机软件为基类来进行继承扩展的话,无疑会使类的数目剧增并且耦合性很高,(如果更改品牌或增加软件都会增加很多的变动)两种方式的结构如下:
所以将两者抽象出来两个基类分别是PhoneBrand和PhoneSoft,那么在品牌类中聚合一个软件对象的基类将解决软件和手机扩展混乱的问题,这样两者的扩展就相对灵活,剪短了两者的必要联系,结构图如下:
这样扩展品牌和软件就相对灵活独立,达到解耦的目的!
个人认为此模式重点实现是在手机品牌上,示例代码可能如下更合理
- /// >虚拟软件基类
- class PhoneSoft
- {
- public:
- PhoneSoft();
- virtual void runSoft();
- /// ....
- };
- /// >通讯录子类
- class PhoneSoftBook : public PhoneSoft
- {
- public:
- PhoneSoftBook();
- virtual void runSoft(){ cout << "book soft run!";}
- };
- /// >mp3子类
- class PhoneSoftMp3 : public PhoneSoft
- {
- public:
- PhoneSoftMp3();
- virtual void runSoft(){ cout << "mp3 soft run!";}
- };
- / > 其他soft子类
- class PhoneBrand
- {
- public :
- void addNewSoft(PhoneSoft * soft){ m_softs.append(soft);}
- void runAllSoft()
- {
- foreach(PhoneSoft*item, m_softs)
- {
- item->runSoft();
- }
- }
- private:
- QList<PhoneSoft*> m_softs;
- };
- class PhoneBrand_A : public PhoneBrand
- {
- public:
- PhoneBrand_A();
- };
- class PhoneBrand_B : public PhoneBrand
- {
- public:
- PhoneBrand_B();
- };
- void main()
- {
- /// >创建通讯录
- PhoneSoft * soft = new PhoneSoftBook;
- /// A品牌手机添加通讯录软件
- PhoneBrand_A *aBrand = new PhoneBrand_A;
- aBrand->addNewSoft(soft);
- /// A品牌手机添加软件mp3
- soft = new PhoneSoftMp3;
- aBrand->addNewSoft(soft);
- /// B品牌手机添加通讯录软件
- soft = new PhoneSoftBook;
- PhoneBrand_B *bBrand = new PhoneBrand_B;
- bBrand->addNewSoft(soft);
- /// B品牌手机添加软件mp3
- soft = new PhoneSoftMp3;
- bBrand->addNewSoft(soft);
- }