桥接模式的这个骨头过去感觉好一点了,因为Adapter不是那么复杂了。
适配器模式要解决的问题很简单:就是将一个你想用又不能直接用的通过一种中间类变成你能用的。(不知道这么说对不对)生活中,我们不也有过将三头插头转成两头的么。
其实将Adaptee(我们的目的)放到Adapter中作为成员来管理,Adaptee的接口也放在Adapter中封装,这样就完成转换了,变成两脚插头了,Adaptee的设计要用一次多态,继承自Adapter,给Client作为接口。代码应该不用了,暂略,我明天早上来写。
-----------------------------------10.2-----------------------------------------------------
信守诺言,上代码:
//----target------
#ifndef _TARGET_H__
#define _TARGET_H__
class Target
{
public:
Target();
virtual ~Target();
virtual void request() = 0;
};
#endif
#include "target.h"
Target::Target()
{
}
Target::~Target()
{
}
//-----adaptee-----
class Adaptee
{
public:
Adaptee();
~Adaptee();
void special_request();
};
#endif
//adaptee.cpp
#include "adaptee.h"
#include <iostream>
using namespace std;
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
void Adaptee::special_request()
{
cout<<"SPECIAL REQUEST FROM ADAPTEE"<<endl;
}
//-----adapter-------
#ifndef _ADAPTER_H__
#define _ADAPTER_H__
#include "target.h"
#include "adaptee.h"
class Adapter:public Target
{
public:
Adapter();
~Adapter();
void request();
private:
Adaptee *adaptee_;
};
#endif
#include "adapter.h"
Adapter::Adapter():
adaptee_(new Adaptee())
{
}
Adapter::~Adapter()
{
}
void Adapter::request()
{
adaptee_->special_request();
}
//-----client-----
#include "adapter.h"
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
Target *tar = new Adapter();
tar->request();
cout<<"1"<<endl;
return 0;
}
//makefile
adapter:main.o adaptee.o target.o adapter.o
g++ -o adapter main.o adaptee.o target.o adapter.o
main.o:main.cpp adapter.h
g++ -o main.o -c main.cpp
adaptee.o:adaptee.h adaptee.cpp
g++ -o adaptee.o -c adaptee.cpp
target.o:target.h target.cpp
g++ -o target.o -c target.cpp
adapter.o:adapter.h adapter.cpp adaptee.h target.h
g++ -o adapter.o -c adapter.cpp
clean:
rm -f *.o
我真的没想到这个代码竟然整到现在,除了makefile之外的那些都不难,就当我在linux上准备运行时,一切都不那么顺利,我很少在linux上跑c++,这次算是还债了,makefile比较生疏,最终跌跌撞撞还是弄出来了,汗,求轻喷~