• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            設(shè)計模式之command模型

            Command(命令):選擇操作模型,大體上我們可以理解此類設(shè)計模型是個函數(shù)對象,將函數(shù)封裝為對象,以參數(shù)傳遞給其他對象或函數(shù),以告訴它們在履行過程中執(zhí)行特定的操作。
            class Command {
            public:
              virtual void execute() = 0;
            };

            class Hello : public Command {
            public:
              void execute() { cout << "Hello "; }
            };

            class World : public Command {
            public:
              void execute() { cout << "World! "; }
            };

            class IAm : public Command {
            public:
              void execute() { cout << "I'm the command pattern!"; }
            };

            // An object that holds commands:
            class Macro {
              vector<Command*> commands;
            public:
              void add(Command* c) { commands.push_back(c); }
              void run() {
                vector<Command*>::iterator it = commands.begin();
                while(it != commands.end())
                  (*it++)->execute();
              }
            };

            int main() {
              Macro macro;
              macro.add(new Hello);
              macro.add(new World);
              macro.add(new IAm);
              macro.run();
            } ///


            GoF認(rèn)為command是替代callback的面向?qū)ο蟮奶娲?command常用的一個例子就是“撤銷(undo)”操作;一個典型的command模式僅僅創(chuàng)建它并把它傳遞給一個函數(shù)或?qū)ο蟆J窍旅娴氖纠a如何消除正常操作和事件處理的decouling(耦合),在事件驅(qū)動編程中。
            #include <iostream>
            #include <vector>
            #include <string>
            #include <ctime>
            #include <cstdlib>
            using namespace std;

            // Framework for running tasks:
            class Task {
            public:
              virtual void operation() = 0;
            };

            class TaskRunner {
              static vector<Task*> tasks;
              TaskRunner() {} // Make it a Singleton
              TaskRunner& operator=(TaskRunner&); // Disallowed
              TaskRunner(const TaskRunner&); // Disallowed
              static TaskRunner tr;
            public:
              static void add(Task& t) { tasks.push_back(&t); }
              static void run() {
                vector<Task*>::iterator it = tasks.begin();
                while(it != tasks.end())
                  (*it++)->operation();
              }
            };

            TaskRunner TaskRunner::tr;
            vector<Task*> TaskRunner::tasks;

            class EventSimulator {
              clock_t creation;
              clock_t delay;
            public:
              EventSimulator() : creation(clock()) {
                delay = CLOCKS_PER_SEC/4 * (rand() % 20 + 1);
                cout << "delay = " << delay << endl;
              }
              bool fired() {
                return clock() > creation + delay;
              }
            };

            // Something that can produce asynchronous events:
            class Button {
              bool pressed;
              string id;
              EventSimulator e; // For demonstration
            public:
              Button(string name) : pressed(false), id(name) {}
              void press() { pressed = true; }
              bool isPressed() {
                if(e.fired()) press(); // Simulate the event
                return pressed;
              }
              friend ostream&
              operator<<(ostream& os, const Button& b) {
                return os << b.id;
              }
            };

            // The Command object
            class CheckButton : public Task {
              Button& button;
              bool handled;
            public:
              CheckButton(Button & b) : button(b), handled(false) {}
              void operation() {
                if(button.isPressed() && !handled) {
                  cout << button << " pressed" << endl;
                  handled = true;
                }
              }
            };

            // The procedures that perform the main processing. These
            // need to be occasionally "interrupted" in order to
            // check the state of the buttons or other events:
            void procedure1() {
              // Perform procedure1 operations here.
              // ...
              TaskRunner::run(); // Check all events
            }

            void procedure2() {
              // Perform procedure2 operations here.
              // ...
              TaskRunner::run(); // Check all events
            }

            void procedure3() {
              // Perform procedure3 operations here.
              // ...
              TaskRunner::run(); // Check all events
            }

            int main() {
              srand(time(0)); // Randomize
              Button b1("Button 1"), b2("Button 2"), b3("Button 3");
              CheckButton cb1(b1), cb2(b2), cb3(b3);
              TaskRunner::add(cb1);
              TaskRunner::add(cb2);
              TaskRunner::add(cb3);
              cout << "Control-C to exit" << endl;
              while(true) {
                procedure1();
                procedure2();
                procedure3();
              }
            }
            說明:這里command對象由Task表示,EventSimoulator創(chuàng)建一個隨機(jī)延遲事件,它的對象在Button中使用,用來模擬某個不可預(yù)知的時間段用戶事件發(fā)生的動作。CheckButton是Task的實(shí)現(xiàn),我們也可以把Taskrunner::run()放到一個多線程處理的“計時器”對象中,由此創(chuàng)建一個線程的方案。

            posted on 2009-04-12 08:24 Benjamin 閱讀(449) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久久久亚洲AV综合波多野结衣 | 综合久久国产九一剧情麻豆| 久久久久中文字幕| 欧美日韩精品久久久免费观看| 久久国产乱子伦免费精品| 亚洲乱码精品久久久久..| 97久久超碰国产精品2021| 精品久久久久久久久久中文字幕| 亚洲国产成人精品久久久国产成人一区二区三区综 | 无码人妻久久一区二区三区免费丨 | 四虎亚洲国产成人久久精品| 日本免费一区二区久久人人澡| 久久这里只有精品首页| 伊人色综合久久天天| 久久精品国产2020| AA级片免费看视频久久| 久久久精品国产| 久久久九九有精品国产| 久久久久青草线蕉综合超碰| 国产免费福利体检区久久| 久久精品午夜一区二区福利| 手机看片久久高清国产日韩| 一本一道久久精品综合| 日韩AV无码久久一区二区 | 久久精品一区二区三区AV| 国产成人精品久久免费动漫| 日韩人妻无码一区二区三区久久99 | 国产精品久久久久aaaa| 日韩电影久久久被窝网| 99久久综合国产精品二区| 国产精品美女久久久m| 久久亚洲国产最新网站| 亚洲国产成人乱码精品女人久久久不卡 | 精品久久久久久国产| 蜜臀久久99精品久久久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 国产精品久久久久jk制服| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 久久久久女教师免费一区| 亚洲国产精品久久久久久| 国产成人精品久久一区二区三区|