本例取自《敏捷软件开发》第13章,使用Command和Active Object模式实现延时处理
#include <list>
using namespace std;
class Command
{
public:
Command():execed(false)
{}
virtual ~Command()
{}
virtual void exec()=0;
protected:
bool execed;
};
class WakeUpCommand:public Command
{
void exec()
{
execed = true;
}
};
class ActiveObjectEngine
{
public:
void add(Command* arg)
{
// cout<<"add"<<endl;
lists.push_back(arg);
}
void run()
{
list<Command*>::iterator iter = lists.begin();
while(iter != lists.end())
{
(*iter)->exec();
iter++;
}
}
private:
list<Command*> lists;
};
class SleepCommand:public Command
{
public:
SleepCommand(int length, ActiveObjectEngine& engineer,Command& wakeUp)
:start(0),length(length),wakeUp(wakeUp), engineer(engineer)
{}
void exec()
{
clock_t current = clock();
if(isExeced())
{
if(isExpired(current))
{
engineer.add(&wakeUp);
}
else
{
engineer.add(this);
}
}
else
{
execed = true;
start = clock();
engineer.add(this);
}
}
private:
bool isExeced()
{
return execed;
}
bool isExpired(time_t arg)
{
return (arg - start >= length);
}
private:
clock_t start;
int length;
Command& wakeUp;
ActiveObjectEngine& engineer;
};
void command()
{
ActiveObjectEngine engine;
WakeUpCommand wakeUp;
SleepCommand sleep(5000, engine,wakeUp);
clock_t start;
clock_t end;
start = clock();
engine.add(&sleep);
engine.run();
end = clock();
printf("time is %f",difftime(end,start));
}