1.image.h
#ifndef IMAGE
#define IMAGE
#include<iostream>
using namespace std;
class Image {
public:
virtual void imagePattern() {}
};
class JPGImage : public Image {
public:
void imagePattern() {
cout << "图像显示格式为jpg" << endl;
}
};
class BMPImage : public Image {
public:
void imagePattern() {
cout << "图像显示格式为bmp" << endl;
}
};
class GIFImage : public Image {
public:
void imagePattern() {
cout << "图像显示格式为gif" << endl;
}
};
class Os {
public:
virtual void system(Image* img) {}
};
class WindowOs : public Os {
public:
void system(Image* img) {
img->imagePattern();
}
};
class LinuxOs : public Os {
public:
void system(Image* img) {
img->imagePattern();
}
};
#endif
2.main.cpp
#include"image.h"
int main() {
Image* img1 = new JPGImage();
Image* img2 = new BMPImage();
Os * os1 = new WindowOs();
os1->system(img1);
os1->system(img2);
return 0;
}
3.定义
桥接模式:
将抽象部分与其实现部分分离,使它们都可以独立地变化.它是一种结构型模式,也称接口模式
4.结构
(1)Abstraction(抽象类): 用于定义抽象类的接口.它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法. —-Os
(2)RefinedAbstraction(扩充抽象类): 扩充有Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了Abstractionz中声明的抽象业务方法,在RefineAbstraction中可以调用在Implementor中定义的业务方法—-WindowOs 和 LinuxOs 类
(3)Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致.通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系 —- Image类
(4)ConcreteImplementor(具体实现类): 具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现.—-JPGImage 等类, ImagePattern的具体实现
5.小结
桥接模式是设计java虚拟机和实现JDBC等驱动程序的和性模式之一,应用较为广泛.在软件开发中,如果一个类或一个系统有多个变化维度时,都可以尝试使用桥接模式对其进行设计.桥接模式降低了系统的复杂度.
6.适应场景
(1)如果一个系统需要在抽象类和具体类之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系
(2)抽象部分和实现部分可以以继承的方法独立扩展而互不影响,在程序运行时可以动态的将一个抽象类子类的对象和一个实现类子类的对象进行组合,即系统需要对抽象类角色和实现类角色进行动态耦合
(3)一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要进行独立扩展.
(4)对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用.