意图:
将一个类的接口转换成客户希望的另外一个接口,Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。
实例:
假设现在有一个图形绘制程序,有绘制与填充函数,此时定义一个公有的虚基类shape,并添加虚函数display与fill,当我要绘制正方形,从shape类派生出square类,要绘制线,从shape类中派生出line类。假设又要添加一个绘制圆的需求,我可以像前面一样继续派生出一个圆的类,但是此时有一个人已经写好了处理圆的这些操作的类,假设叫XXCircle类,但是它的命名方法跟我shape类中的这些命名方法不同。我不能直接使用XXCircle类,因为我想保持Shape类的多态行为,原因如下 1)因为XXCircle类中的方法,参数列表都不同 2)我不能直接派生XXCircle,因为它还必须从Shape派生。 我也不能直接修改XXCircle类,因为其他地方可能正在用这个类,这样要修改的地方太多。 这时候就体现出Adapter模式 的用途了。
根据上面的需求,c++代码描述如下:
#include<iostream>
#include<list>
using namespace std;
class Shape
{
public:
Shape() {}
~Shape() {}
virtual void dispaly() = 0;
virtual void fill() = 0;
};
class Square :public Shape
{
public:
Square() {}
~Square() {}
void dispaly()
{
cout << "正方形的显示" << endl;
}
void fill()
{
cout << "正方形的填充" << endl;
}
};
class Line :public Shape
{
public:
Line() {}
~Line() {}
void dispaly()
{
cout << "线的显示" << endl;
}
void fill()
{
cout << "线的填充" << endl;
}
};
class XXCircle
{
public:
XXCircle() {}
~XXCircle() {}
void drawCircle()
{
cout << "XXCircle类圆的绘制方法" << endl;
}
void fillCircle()
{
cout<< "XXCircle类圆的填充方法" << endl;
}
};
class Circle :public Shape
{
public:
void dispaly()
{
myXXCircle.drawCircle();
}
void fill()
{
myXXCircle.fillCircle();
}
private:
XXCircle myXXCircle;
};
int main()
{
Square *squ = new Square;
Line *line = new Line;
Circle *cir = new Circle;
list<Shape*>shapeList;
shapeList.push_back(squ);
shapeList.push_back(line);
shapeList.push_back(cir);
for (auto p : shapeList)
{
p->dispaly();
p->fill();
cout << endl;
}
system("pause");
}
执行结果如下
效果:使原有对象能够适应新的结构,不受接口的限制。
实现:将原有类包含在另一个类之中。让包含类与需要的接口匹配,调用被包容类的方法。