适配器:把客户类的请求转化为对适配者的相应的接口的调用。
当客户类调用适配器中的方法时,在适配器中将调用适配者的方法。
根据适配器类与适配者类的不同:
适配器可以分为类适配器或者对象适配器。
在对象适配器中,适配器与适配者之间是关联关系。
在类适配器中,适配器与适配者之间是继承关系。
在实际开发中,对象适配器的使用频率更高
STL 中的适配器 stack ,queue list 都是适配器模式
对象适配器:
class Target
{
public:
virtual void Request()
{
std::cout << "Target::Request" << std::endl;
}
};
class Adaptee
{
public:
virtual void NewRequest()
{
std::cout << "Adaptee::NewRequest" << std::endl;
}
};
class AdapterObj :public Target
{
private:
std::unique_ptr<Adaptee> adaptee_;
public:
AdapterObj()
{
adaptee_.reset(new Adaptee());
}
void Request()
{
adaptee_->NewRequest();
}
};
int main()
{
std::unique_ptr<Target> pt(new Target());
std::unique_ptr<Target> pt2(new AdapterObj());
pt->Request();
pt2->Request();
return 0;
}
类适配器:
一个适配者:
class Target
{
public:
virtual void Request()
{
std::cout << "Target::Request" << std::endl;
}
};
class Adaptee
{
public:
virtual void NewRequest()
{
std::cout << "Adaptee::NewRequest" << std::endl;
}
};
class AdapterClass :public Target,private Adaptee
{
public:
void Request()
{
Adaptee::NewRequest();
}
};
int main()
{
std::unique_ptr<Target> tg(new Target());
std::unique_ptr<Target> tg2(new AdapterClass());
tg->Request();
tg2->Request();
}
多个适配者:
class Target
{
public:
virtual void request()
{
std::cout << "Target::request" << std::endl;
}
virtual ~Target()
{
std::cout << "~Target" << std::endl;
}
};
class Adeptee
{
public:
virtual void NewRequest()
{
std::cout << "Adeptee::NewRequest" << std::endl;
}
~Adeptee() { std::cout << "~Adeptee" << std::endl; }
};
class Adeptee2
{
public:
virtual void NewRequest()
{
std::cout << "Adeptee2::NewRequest" << std::endl;
}
~Adeptee2() { std::cout << "~Adeptee2" << std::endl; }
};
class Adeptee3
{
public:
virtual void NewRequest()
{
std::cout << "Adeptee3::NewRequest" << std::endl;
}
~Adeptee3() { std::cout << "~Adeptee3" << std::endl; }
};
template<class Ada>
class Adepter : public Target, private Ada
{
public:
Adepter() { }
virtual void request()
{
Ada::NewRequest();
}
};
int main()
{
std::unique_ptr<Target> pa(new Adepter<Adeptee>());
std::unique_ptr<Target> pa2(new Adepter<Adeptee2>());
std::unique_ptr<Target> pa3(new Adepter<Adeptee3>());
pa->request();
pa2->request();
pa3->request();
}