2016-07-22
(www.cnblogs.com/icmzn)
模式理解
1. Bridge模式的定义
将抽象与实现解耦,使两个可以独立的发生变化。桥接模式的重点在“解耦”。
一般桥接模式有以下四个角色
(1)“抽象角色的抽象”:通过组合保留“实现橘色”的引用。
(2)具体的“抽象角色”:通过组合引用的实现类,对实现类抽象进行操作处理。
(3)“实现角色的抽象”:抽象类,定义实现角色必须的动作和行为。
(4)具体的实现角色:完成实现类角色抽象的具体的实现。
主要是通过抽象角色引用实现角色(组合的方式),或者是抽象角色的部分实现是实现角色提供的,
即实现角色通过实现角色的抽象的引用为抽象角色提供部分的实现支持。
即(4)通过(3)的必须的动作和行为接口为(1)的(2)完成部分或者全部的实现支持。
2. Bridge 模式的优点
(1)抽象与实现相分离
解决的继承的缺点,因为继承严格限制了类之间的强关联关系,而Bridge模式则描述了一种类之间这种弱的关联关系,实现可以不受抽象的约束
,不需要被严格限制在抽象层面的。
(2)优秀的扩展能力
抽象与实现都发生变化,从而实现“解耦”,扩充能力强
(3)抽象层通过聚合的方式,实现了对实现的封装。
3. Bridge 模式适用场景
(1)接口或者抽象类不明确的情况
(2)用继承存在问题,继承层次过度,无法进行更细致化的操作,需要使用桥接模式
(3)重用性要求较高,采用继承则严格收到父类的限制,不可以设计太细的颗粒度。
(4)在系统进行设计的时候,如果类的继承有N层,则可以考虑桥接模式。
4. Bridge 模式的讨论与注意
(1)继承的特征:可以把公共的方法或属性抽取,父类封装共性,子类实现特性,这是继承的基本运用。
缺点:父类具有很强的入侵性,子类必须无条件接受父类的一切,并且父类的某个接口不能轻易改动,因为可能影响到底层的子类的执行。
桥接模式Bridge:描述了类之间的弱的关联关系,可以吧可能会发生变化的方法放出去,对于关联关系很弱的,则考虑用桥接模式。
程序实现(C++)
AbsCorp.h
1 #pragma once 2 3 4 /* 5 通过桥接模式,完成公司与产品的分离 6 因为在公司是一个整体,产品是不断变化的,并且公司也是不断兼并重构的,二者都是发展变化的,不能同限制的继承的思想完成二者的处理。 7 公司的通用特征是可以抽象的,产品的通用行为可以抽象,公司的子类可以对产品行为进行部分修改处理。具体的产品不同的属性方法可以特殊定义。 8 */ 9 #include "AbsProduct.h" 10 11 // 12 class CAbsCorp 13 { 14 public: 15 CAbsCorp() 16 { 17 m_pProduct = nullptr; 18 } 19 ~CAbsCorp() 20 { 21 delete m_pProduct; 22 } 23 CAbsCorp(CAbsProduct* pProduct) : m_pProduct(pProduct){}; 24 25 public: 26 virtual void setProduct(CAbsProduct* pProduct) 27 { 28 _ASSERT(pProduct); 29 if (m_pProduct) 30 delete m_pProduct; 31 m_pProduct = pProduct; 32 } 33 virtual void makeMoney() 34 { 35 m_pProduct->toMake(); 36 m_pProduct->toSell(); 37 } 38 virtual void expendCrop() = 0; 39 40 protected: 41 CAbsProduct* m_pProduct; 42 }; 43 44 class CCarCop : public CAbsCorp 45 { 46 public: 47 48 CCarCop(CAbsProduct* pProduct) : CAbsCorp(pProduct){}; 49 void expendCrop() override 50 { 51 cout << "本CAr公司要做些特殊的事情" << endl; 52 m_pProduct->doSomethingSpecial(); 53 cout << "本CAr公司要扩张..." << endl; 54 } 55 }; 56 57 class CShanZhaiCop : public CAbsCorp 58 { 59 public: 60 CShanZhaiCop(CAbsProduct* pProduct) : CAbsCorp(pProduct){}; 61 void expendCrop() override 62 { 63 cout << "本CShanZhaiCop公司要做些特殊的事情" << endl; 64 m_pProduct->doSomethingSpecial(); 65 cout << "本CShanZhaiCop公司要扩张..." << endl; 66 } 67 };
AbsProduct.h
1 #pragma once 2 3 #include <iostream> 4 using namespace std; 5 6 class CAbsProduct 7 { 8 public: 9 CAbsProduct(); 10 ~CAbsProduct(); 11 public: 12 virtual void toMake() = 0; 13 virtual void toSell() = 0; 14 virtual void doSomethingSpecial() = 0; 15 }; 16 17 18 class CCarProduct : public CAbsProduct 19 { 20 public: 21 void toMake() override 22 { 23 cout << "汽车产品进行生产..." << endl; 24 } 25 void toSell() override 26 { 27 cout << "汽车产品进行销售..." << endl; 28 } 29 void doSomethingSpecial() override 30 { 31 cout << "汽车的市场调研分析..." << endl; 32 } 33 }; 34 35 class CComputer : public CAbsProduct 36 { 37 public: 38 void toMake() override 39 { 40 cout << "Computer进行生产..." << endl; 41 } 42 void toSell() override 43 { 44 cout << "Computer进行销售..." << endl; 45 } 46 47 void doSomethingSpecial() override 48 { 49 cout << "Computer市场调研分析..." << endl; 50 } 51 };
(1)模板应用
main.cpp
1 // Bridge.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "AbsCorp.h" 6 7 #include <iostream> 8 using namespace std; 9 10 int _tmain(int argc, _TCHAR* argv[]) 11 { 12 //一般公司的操作 13 cout << "\n\n一般公司操作...." << endl; 14 CAbsCorp* pCorp = new CCarCop(new CCarProduct()); 15 pCorp->makeMoney(); 16 pCorp->expendCrop(); 17 delete pCorp; 18 19 //山寨公司的操作 20 cout << "\n\n山寨公司的操作山寨汽车...." << endl; 21 pCorp = new CShanZhaiCop(new CCarProduct()); 22 pCorp->makeMoney(); 23 pCorp->expendCrop(); 24 cout << endl; 25 cout << "山寨公司要山寨所有的产品了...." << endl; 26 pCorp->setProduct(new CComputer()); 27 pCorp->expendCrop(); 28 pCorp->makeMoney(); 29 delete pCorp; 30 31 system("pause"); 32 return 0; 33 }
(2)输出展示