适配器模式比较简单。就是一种辅助类用一个类来模拟另一个类。C++ 中没有 interface 这个概念,全部用纯虚类来代替。适配器模式的难点在于如何用一种 interface 去模拟另一种 interface,但是这个问题更多的是算法层面的,与设计模式关系不大。
下面是代码:
/// duck.h
#ifndef DUCK_H
#define DUCK_H
#include <iostream>
class Duck
{
public:
virtual void quack() = 0;
virtual void fly() = 0;
};
class MallardDuck : public Duck
{
public:
void quack() override
{
std::cout << "Quack" << std::endl;
}
void fly() override
{
std::cout << "I'm flying" << std::endl;
}
};
#endif // DUCK_H
///turkey.h
#ifndef TURKEY_H
#define TURKEY_H
#include <iostream>
class Turkey
{
public:
virtual void gobble() = 0;
virtual void fly() = 0;
};
class WildTurkey : public Turkey
{
public:
void gobble() override
{
std::cout << "Gobble gobble" << std::endl;
}
void fly() override
{
std::cout << "I'm flying a short distance" << std::endl;
}
};
#endif // TURKEY_H
///DuckAdapter.h
#ifndef DUCKADAPTER_H
#define DUCKADAPTER_H
#include "duck.h"
#include "turkey.h"
class DuckAdapter : public Turkey
{
public:
DuckAdapter(Duck * duck);
void gobble() override;
void fly() override;
private:
Duck* m_duck;
};
#endif // DUCKADAPTER_H
///DuckAdapter.cpp
#include "duckadapter.h"
#include <stdlib.h>
DuckAdapter::DuckAdapter(Duck *duck)
{
m_duck = duck;
}
void DuckAdapter::gobble()
{
m_duck->quack();
}
void DuckAdapter::fly()
{
if(rand() % 5 == 0)
{
m_duck->fly();
}
}
///TurkeyAdapter.h
#ifndef TURKEYADAPTER_H
#define TURKEYADAPTER_H
#include "turkey.h"
#include "duck.h"
class TurkeyAdapter : public Duck
{
public:
TurkeyAdapter(Turkey *turkey);
void quack() override;
void fly() override;
private:
Turkey* m_turkey;
};
#endif // TURKEYADAPTER_H
///TurkeyAdapter.cpp
#include "turkeyadapter.h"
TurkeyAdapter::TurkeyAdapter(Turkey *turkey)
{
m_turkey = turkey;
}
void TurkeyAdapter::quack()
{
m_turkey->gobble();
}
void TurkeyAdapter::fly()
{
for(int i=0; i < 5; i++)
{
m_turkey->fly();
}
}
最后是测似代码:
#include <iostream>
#include "duck.h"
#include "turkey.h"
#include "duckadapter.h"
#include "turkeyadapter.h"
using namespace std;
void testDuck(Duck &duck)
{
duck.quack();
duck.fly();
}
int main(int argc, char *argv[])
{
MallardDuck* duck = new MallardDuck();
WildTurkey* turkey = new WildTurkey();
Duck* turkeyAdapter = new TurkeyAdapter(turkey);
cout << "The Turkey says..." << endl;
turkey->gobble();
turkey->fly();
cout << "\nThe Duck says..." << endl;
testDuck(*duck);
cout << "\nThe TurkeyAdapter says..." << endl;
testDuck(*turkeyAdapter);
Turkey *duckAdapter = new DuckAdapter(duck);
for(int i=0;i<10;i++)
{
cout << "The DuckAdapter says..." << endl;
duckAdapter->gobble();
duckAdapter->fly();
}
return 0;
}