(19) 桥接模式 Bridge,不是采用类继承,而是采用类组合,一个类的数据成员是类对象,来扩展类的功能。源码如下:
class OS // 操作系统负责绘图
{
public:
virtual ~OS() {}
virtual void draw(char * ptrCache , int lengthCache) = 0 ;
};
class OS_Window : public OS
{
public:
void draw(char* ptrCache, int lengthCache) { cout << " windows 下绘图\n\n"; }
};
class OS_Linux : public OS
{
public:
void draw(char* ptrCache, int lengthCache) { cout << " Linux 下绘图\n\n"; }
};
class Image // 本基类有成员函数负责解析与加载图片至缓存,但绘图调用跟操作系统有关的底层函数
{
protected: OS * ptrOS;
public:
virtual ~Image() {}
Image(OS* p) : ptrOS(p) {}
virtual void parseImage( const char * name) = 0;
};
class Image_jpg : public Image
{
public:
Image_jpg(OS * p) : Image(p){}
void parseImage(const char* name)
{
cout << " 解析 jpg 图片 , ";
char c[100]; // 假定分析 jpg 格式后的图片信息统一用 100 字节存储。
ptrOS->draw(c , 100);
}
};
class Image_png : public Image
{
public:
Image_png(OS* p) : Image(p) {}
void parseImage( const char* name)
{
cout << " 解析 png 图片 , ";
char c[50]; // 假定分析 png 格式后的图片信息统一用 50 字节存储。
ptrOS->draw(c, 50);
}
};
int main()
{
OS_Window osWindow;
OS_Linux osLinux;
Image_jpg jpgA(&osLinux) , jpgB(&osWindow) ;
Image_png pngA(&osLinux) , pngB(&osWindow) ;
jpgA.parseImage("aaa");
jpgB.parseImage("b");
pngA.parseImage("c");
pngB.parseImage("dd");
return 0;
}
测试结果如下:
(20)
谢谢