#include <iostream> using namespace std; class Action {//command public: virtual ~Action(){}; virtual void operator() () = 0; virtual Action *clone() const = 0;//prototype }; class Button { public: Button(const string &label) :label_(label), action_(0) { } void setAction(const Action *newAction); void onClick() const; private: string label_; Action *action_;//command }; void Button::setAction(const Action *newAction) { Action *tmp = newAction->clone(); delete action_; action_ = tmp; } void Button::onClick() const { if(action_) action_(); } class PlayMusic:public Action { public:   ![]() void operator()();   ![]() private: string song_; }; void PlayMusic::operator()() //播放音乐动作的执行代码 { cout<<"I am playing music, song name is "<<song_<<endl; } PlayMusic *PlayMusic::clone() const { return new PlayMusic(song_); } int main() { Button *b = new Button("Anoko no namaewa"); auto_ptr<PlayMusic> song(new PlayMusic("Anokononamaewa.mp3")); b->setAction(song); } |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |