桥接模式的特点: 桥接模式的主要目的是将一个对象的变化因素抽象出来,不是通过类继承的方式来满足这个因素的变化,而是通过对象组合的方式来依赖因素的抽象,这样当依赖的因素的具体实现发生变化后,而我们的具体的引用却不用发生改变,因为我们的对象是依赖于抽象的,而不是具体的实现。 而且,通过这样的依赖抽象,我们在多个对象共享这样的因素的时候,就成为可能,如果我们使用的是具体的因素的共享,当我们改变这个变化因素的时候,我们必须把使用这个因素的所有的对象,都进行相应的修改,而如果所有的引用这个变化因素的对象都依赖于抽象而不是具体的依赖呢?这也为我们的共享的提供了变化性。
桥接模式的使用场景: 1、当一个对象有多个变化因素的时候,通过抽象这些变化因素,将依赖具体实现,修改为依赖抽象。 2、当某个变化因素在多个对象中共享时。我们可以抽象出这个变化因素,然后实现这些不同的变化因素。 3、当我们期望一个对象的多个变化因素可以动态的变化,而且不影响客户的程序的使用时。
由于有些对象具有两个或者多个维度的变化,通过使用桥接模式可以使得对象能够轻松的沿着多个方向进行自由变化。
例如:图形有各种类型的图形,矩形、 圆形等。图形 又可被不同的绘图程序来绘制 。
window窗口有很多种类,在不同的操作系统平台上又不同。
以上两个例子都是对象在不同层次上的继承关系,两个层次间通过对象聚合实现连接 即桥接
c++ 实现代码如下:
class CImplementor
{
public:
CImplementor();
virtual ~CImplementor();
virtual void OperationImp()=0;
};
class CImplementorA : public CImplementor
{
public:
CImplementorA(){printf("CImplementorA Constructor\n");};;
virtual void OperationImp(){printf("CImplementorA OpeartionImp \n");};
};
class CImplementorB : public CImplementor
{
public:
CImplementorB(){printf("CImplementorB Constructor\n");};;
virtual void OperationImp(){printf("CImplementorB OpeartionImp \n");};
};
class CAbstraction
{
public:
virtual void Operation()=0;
protected:
CImplementor* m_lpImplementor;
private:
};
class CRefinedAbstraction:public CAbstraction
{
public:
CRefinedAbstraction(CImplementor* pImp){m_lpImplementor=pImp;};
virtual void Operation(){m_lpImplementor->OperationImp();};
};
int main(int argc, char* argv[])
{
CAbstraction* as=new CRefinedAbstraction(new CImplementorA);
as->Operation();
getchar();
return 0;
}
独立博客地址: http://www.gddhx.com/post/25.html