设计模式学习总结之四
六:Bridge模式(即:桥接模式)
讲之前,先声明:由于本人电脑不是很好,没法装上vc环境运行。因此以下代码,仅是手工输入,在环境中未必能编译通过。
但以下,仅仅只是介绍一种思想。仅供参考。同时,如果说明有误之处,欢迎指正。另外,则于一次性手工输入下面那么多东东,确实
不容易,所以Delphi的具体实现。就不在此列出。如有兴趣用Delphi实现的朋友,也可以找本人交流,本人盛感荣幸。
(当然如果是C++的朋友也同样、甚至更加欢迎)
看了这么多次的桥接模式,这次总算明白了。要想理解桥接模式,个人认为,还是有必要同抽象及其实现进行一下比较。
1) 抽象及实现。我相信,跟不同的人说话,都会有诀窍在里头。同是coder,相信,最默契的沟通,还是code吧。我们来看下抽象及其实现的代码。
//抽象基类声明
class AbstractClassX
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//AbstractClassX的具体实现 ClassXImplX1
class ClassXImplX1 : public AbstractClassX
{
....
public:
void DoSomething(void){ // do something with method 1... }
}
//AbstractClassX的具体实现 ClassXImplX2
class ClassXImplX2 : public AbstractClassX
{
....
public:
void DoSomething(void){ // do something with method 2... }
}
在实际应用中,我们用的是抽象类。而实际上实例化的,却是某具体子类。这种实现被我们多数人所使用。而它实际上解决的只是这么一类问题,即:同一行为的不同表现。当
然大多数需求,用此就可以了。
但现在假如说有这么一种情况:假如说,上面的处理仅仅只适用于平台A,而用户却希望同时,它也要能够在平台B上也能够一样的操作。那当如何?
很明显的,此种需要,并不是行为上的需求,因为不论是在平台A上还是平台B上,都要执行相同的操作。而且表示也是一样的。该需要的实现。实际上是需要我们重新封装个抽象层,
来专门处理平台B上的该行为。而实际的实现,却还是跟平台A上的一样。其实我们仔细一想。其实平台A了的抽象(即:AbstractClassX)与平台B上的抽象(假如为:AbstractClassY),
其实它们是类似的。因为需要处理的功能一样。因此,我们就想,如果将这种抽象与实现具体分离开来。在抽象中,留个具体实现的抽象引用(此其实就是该模式所指的Bridge----即:桥
通过该桥,将抽象与具体的实现连接起来。因此,我想该模式的名称就是因此得来的吧)。那样。抽象可以不受限制的扩展,实现也同样可以不受限制的扩展。这样,系统的框架就不需要
更改,其不妙哉?!因此就有了如下的code
//******************************************************************
//* 抽象声明及抽象部分的实现
//******************************************************************
//抽象的抽象基类声明
class AbstractClass
{
private:
//xxx
protected:
AbstractImpl* m_pAIObj; //具体的抽象实现的抽象对象(这话很ao口,但理解了这话,也就理解了该模式。可以大言不惭地说,该模式的秘密就在这句话上)
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//平台A上的抽象的具体实现(注意:此实现子类,是针对抽象的)
class AbstractClassA : public AbstractClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { m_pAIObj.DoSomething(); }
//xxx
}
//平台B上的抽象的具体实现(注意:此实现子类,是针对抽象的)
class AbstractClassB : public AbstractClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { m_pAIObj.DoSomething(); }
//xxx
}
//******************************************************************
//* 实现的抽象声明及其实现
//******************************************************************
//实现部分的抽象基类声明
class AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) = 0;
//xxx
}
//具体算法1的具体实现
class ImplX : public AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { // do something... }
//xxx
}
//具体算法1的具体实现
class ImplY : public AbstractImplClass
{
private:
//xxx
protected:
//xxx
public:
//xxx
void DoSomething(void) { // do something... }
//xxx
}
//******************************************************************
//* 实际应用方面
//******************************************************************
int main(int argc, char* argv[])
{
AbstractImplClass* pImplObj = new ImplX();//或new ImplY();等等。
//下面注意下:因为上面的代码中,本人为了简写,并没有明确写出抽象部分的具体构造函数。
//相信,是程序员,看完下面这行都懂得,上面的抽象部分的声明,应该声明一个什么样的
//构造函数吧。
AbstractClass* pAbstractObj = new AbstractClassA(pImplObj);//或new AbstractClassB(pImplObj);等等。
//do other something...
//在此补充一点:有上面的设计,系统的框架将都无需修改。不论是实现的具体算法改变了,还是
//抽象的需求变动。程序都无需要修改框架代码,,仅仅只需要写个具体的实现类(不管是实现的实现类,还是
//抽象的实现类)即可。这就是桥接模式。
}