适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
应用分析
主要功能是完成接口转换,通过适配器,将被适配者的接口转换成满足客户需求的接口。
客户使用适配器的过程如下:
客户通过目标接口调用适配器的方法对适配器发出请求;
适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口;
客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
适配器接口分为:对象适配器接口和类适配器接口。
对象适配器——通过组合或委托被适配者实现
类适配器——通过继承被适配者实现
代码分析
//Adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
#include <iostream>
class Duck//鸭子抽象类
{
public:
virtual void quack()=0;
virtual void fly()=0;
};
class Turkey//火鸡抽象类
{
public:
virtual void gobble()=0;
virtual void tfly()=0;
};
class MallardDuck:public Duck//鸭子实体类
{
public:
void quack()
{
std::cout<<"Duck Quack"<<std::endl;
}
void fly()
{
std::cout<<"Duck Fly"<<std::endl;
}
};
class WildTurkey:public Turkey//火鸡实体类
{
public:
void gobble()
{
std::cout<<"Turkey gobble"<<std::endl;
}
void tfly()
{
std::cout<<"Turkey Fly"<<std::endl;
}
};
class TurkeyObjectAdapter:public Duck//对象适配器
{
private:
Turkey *t;
public:
TurkeyObjectAdapter(Turkey *t)
{
this->t=t;
}
void quack()
{
t->gobble();
}
void fly()
{
t->tfly();
}
};
class TurkeyClassAdapter:public Duck,private WildTurkey//类适配器
{
public:
void quack()
{
this->gobble();
}
void fly()
{
this->tfly();
}
};
#endif
//Main.cpp
//测试程序
#include "Adapter.h"
void print_Duck(Duck *d)
{
d->quack();
d->fly();
}
int main()
{
Duck *d=new MallardDuck();//定义鸭子对象
print_Duck(d);
Turkey *t=new WildTurkey();//定义火鸡对象
Duck *ob_t=new TurkeyObjectAdapter(t);//对象适配器
print_Duck(ob_t);
Duck *cl_t=new TurkeyClassAdapter();//类适配器
print_Duck(cl_t);
return 0;
}