桥接模式(Bridge)
桥接模式(Bridge)
桥接模式(Bridge)[Handle/Body]
意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。
应用:不同系统平台的Windows界面。
模式结构:
心得:
用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现的(WindowImp)。我们不应该为不同的实现提供单独的代码,而应该将这些实现上的区别封装起来。WindowImp提供了合适数量和粒度的底层抽象,而实现这些接口的工作由具体的子类来做。这些底层抽象接口通过组合耦合的方式被高层类体系调用,而这一切对用户是透明的。高层类Window及其子类只需要使用WindowImp提供好的接口来实现自己的功能就可以了,当需要进行实现平台的移植的时候只需要更换具体的实现类就可以了,而不会对用户的代码有任何影响。使用桥模式将用户的所见的抽象接口与接口的具体实现分离,而且抽象接口和实现部分是完全独立变化的。该类问题和抽象工厂有点类似,但是不能使用抽象工厂。因为抽象工厂需要产品拥有一致的接口和继承层次,而这些条件在不同的平台上肯定是无法满足的。
举例:
就上述列举的Window的实现问题,我们把实现的C++代码和用户操作代码列举如下:
//底层实现部分
class WindowImp
{
public:
virtual void devDrawText()=0;
virtual void devDrawLine()=0;
virtual ~WindowImp(){}
};
class XWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"XWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"XWindow--Line"<<endl;
}
};
class PMWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"PMWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"PMWindow--Line"<<endl;
}
};
//高层抽象部分
class Window
{
WindowImp*imp;//底层实现
public:
Window(WindowImp*i):imp(i){}
virtual void drawText()
{
imp->devDrawText();
}
virtual void drawRect()
{
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
}
virtual ~Window()
{
delete imp;
}
};
class IconWindow:public Window
{
public:
IconWindow(WindowImp*i):Window(i){}
virtual void drawBoard()
{
drawRect();
drawText();
}
};
class TrasientWindow:public Window
{
public:
TrasientWindow(WindowImp*i):Window(i){}
virtual void drawCloseBox()
{
drawRect();
}
};
WindowImp*imp=new XWindowImp();
Window w(imp);
w.drawText();
w.drawRect();
imp=new PMWindowImp();
IconWindow iw(imp);
iw.drawBoard();
class WindowImp
{
public:
virtual void devDrawText()=0;
virtual void devDrawLine()=0;
virtual ~WindowImp(){}
};
class XWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"XWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"XWindow--Line"<<endl;
}
};
class PMWindowImp:public WindowImp
{
public:
virtual void devDrawText()
{
cout<<"PMWindow--Text"<<endl;
}
virtual void devDrawLine()
{
cout<<"PMWindow--Line"<<endl;
}
};
//高层抽象部分
class Window
{
WindowImp*imp;//底层实现
public:
Window(WindowImp*i):imp(i){}
virtual void drawText()
{
imp->devDrawText();
}
virtual void drawRect()
{
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
imp->devDrawLine();
}
virtual ~Window()
{
delete imp;
}
};
class IconWindow:public Window
{
public:
IconWindow(WindowImp*i):Window(i){}
virtual void drawBoard()
{
drawRect();
drawText();
}
};
class TrasientWindow:public Window
{
public:
TrasientWindow(WindowImp*i):Window(i){}
virtual void drawCloseBox()
{
drawRect();
}
};
WindowImp*imp=new XWindowImp();
Window w(imp);
w.drawText();
w.drawRect();
imp=new PMWindowImp();
IconWindow iw(imp);
iw.drawBoard();
至于imp的构造时机可以通过工厂方法根据不同的平台来构造,用户不需要知道系统构造了什么样的imp对象,至于工厂方法类又可以使用单例模式来实现,这样系统的差别全部被封装在一个单独的对象内。用户代码对Window的操作不受平台的任何约束。
参考文章:http://www.cnblogs.com/fengchao/archive/2005/08/03/206971.html
作者:Florian
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利。
若本文对你有所帮助,您的 关注 和 推荐 是我分享知识的动力!
若本文对你有所帮助,您的 关注 和 推荐 是我分享知识的动力!