Heim  >  Artikel  >  Backend-Entwicklung  >  Ein kurzes Verständnis des Befehlsmodus in C++-Entwurfsmustern

Ein kurzes Verständnis des Befehlsmodus in C++-Entwurfsmustern

黄舟
黄舟Original
2017-01-17 13:43:521484Durchsuche

Der Befehlsmodus kapselt eine Anforderung als Objekt, sodass Sie Clients mit unterschiedlichen Anforderungen in die Warteschlange stellen oder Anforderungsprotokolle aufzeichnen und umkehrbare Vorgänge unterstützen können.

Testfall:

[code]int main(){
    Barbecuer boy;
    BakeChickenWingCommand bakechickenwingcommand1(boy);
    BakeChickenWingCommand bakechickenwingcommand2(boy);
    BakeMuttonCommand bakemuttoncommand1(boy);
    BakeMuttonCommand bakemuttoncommand2(boy);

    Waiter girl;
    girl.SetOrder(&bakechickenwingcommand1);
    girl.SetOrder(&bakechickenwingcommand2);
    girl.SetOrder(&bakemuttoncommand1);
    girl.SetOrder(&bakemuttoncommand2);
    girl.Notify();
    girl.CancelOrder(&bakechickenwingcommand2);
    girl.Notify();

    return 0;
}

Klassenimplementierung:

[code]class Barbecuer{
public:
    void BakeMutton()
    {
        cout << "Meat\n";
    }
    void BakeChickenWing()
    {
        cout << "Chicken\n";
    }
};

class Command{
protected:
    Barbecuer receiver;
public:
    Command(){}
    Command(Barbecuer & b) :receiver(b){}
    virtual void ExcuteCommand() = 0;
};

class BakeMuttonCommand :public Command{
public:
    BakeMuttonCommand(Barbecuer & b) { receiver = b; }
    void ExcuteCommand(){ receiver.BakeMutton(); }
};

class BakeChickenWingCommand :public Command{
public:
    BakeChickenWingCommand(Barbecuer & b) { receiver = b; }
    void ExcuteCommand(){ receiver.BakeChickenWing(); }
};

class Waiter{
    list<Command *>orders;
public:
    void SetOrder(Command * comptr);
    void CancelOrder(Command * comptr);
    void Notify();
};

void Waiter::SetOrder(Command * comptr){
    orders.push_back(comptr);
    cout << "Add order\n";
}

void Waiter::CancelOrder(Command * comptr){
    orders.remove(comptr);
    cout << "Cancel order\n";
}

void Waiter::Notify(){
    for each (Command * var in orders){
        var->ExcuteCommand();
    }
}

Zusammenfassung:

Es ist einfacher, eine Befehlswarteschlange zu entwerfen;
Befehle können bei Bedarf einfach protokolliert werden.

Ermöglicht der Partei, die die Anfrage erhält, zu entscheiden, ob sie ein Veto einlegen möchte.

Die Anfrage kann einfach widerrufen und wiederholt werden.

Da das Hinzufügen einer neuen Befehlsklasse keine Auswirkungen auf andere Klassen hat, ist es einfach, neue spezifische Befehlsklassen hinzuzufügen.

Der Befehlsmodus trennt das Objekt, das eine Operation anfordert, von dem Objekt, das weiß, wie eine Operation ausgeführt wird


Das Obige ist der Inhalt des Befehlsmodus im C++-Designmodus. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn