zoukankan      html  css  js  c++  java
  • 命令模式

    一、简介

    1、命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

    2、命令模式中的几个角色

    客户(Client):创建了一个具体命令(ConcreteCommand)对象并确定其接收者。

    命令(Command):声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。

    具体命令(ConcreteCommand):定义一个接受者和行为之间的弱耦合;实现Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执行方法。

    请求者(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。

    接收者(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

    3、UML

    4、所属类别:行为型

    二、C++程序

     1 // 命令模式.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 #include<list>
     7 using namespace std;
     8 
     9 //命令执行者
    10 class Cooker
    11 {
    12 public:
    13     Cooker(){}
    14     ~Cooker(){}
    15     void kaojirou()
    16     {
    17         cout<<"烤鸡肉"<<endl;
    18     }
    19     void kaoyangrou()
    20     {
    21         cout<<"烤羊肉"<<endl;
    22     }
    23 };
    24 //抽象命令类
    25 class Command
    26 {
    27 protected:
    28     Cooker * cooker;
    29 public:
    30     Command(Cooker* c)
    31     {
    32         cooker=c;
    33     }
    34     virtual ~Command(){}
    35     virtual void excute()=0;
    36 };
    37 //具体的命令1
    38 class Command_kaojirou:public Command
    39 {
    40 public:
    41     Command_kaojirou(Cooker* c):Command(c)
    42     {}
    43     virtual ~Command_kaojirou(){}
    44     virtual void excute()
    45     {
    46         cooker->kaojirou();
    47     }
    48 };
    49 //具体的命令2
    50 class Command_kaoyangrou:public Command
    51 {
    52 public:
    53     Command_kaoyangrou(Cooker* c):Command(c)
    54     {}
    55     virtual ~Command_kaoyangrou(){}
    56     virtual void excute()
    57     {
    58         cooker->kaoyangrou();
    59     }
    60 };
    61 //命令的通知者
    62 class Waiter
    63 {
    64 private:
    65     list<Command*> commands;
    66 public:
    67     Waiter(){}
    68     ~Waiter(){}
    69     //添加命令
    70     void add_command(Command* c)
    71     {
    72         commands.push_back(c);
    73     }
    74     //通知命令
    75     void notify()
    76     {
    77         list<Command*>::iterator it;
    78         it=commands.begin();
    79         for(;it!=commands.end();it++)
    80         {
    81             (*it)->excute();
    82         }
    83     }
    84 };
    85 int _tmain(int argc, _TCHAR* argv[])
    86 {
    87     Cooker *cook=new Cooker();
    88     Command_kaojirou *kaorou=new Command_kaojirou(cook);
    89     Waiter *waiter=new Waiter();
    90     waiter->add_command(kaorou);
    91     waiter->notify();
    92     return 0;
    93 }
  • 相关阅读:
    jetty服务器
    好久不用的正则表达式
    mysql技术调优资料整理
    .net互转java 转行必备
    docker学习资料整理(持续更新中..)
    tcpdump来抓取执行的sql语句
    DDoS deflate
    Linux网络相关查询脚本
    linux下无法删除文件的原因
    linux使用FIO测试磁盘的iops 【转载】
  • 原文地址:https://www.cnblogs.com/bewolf/p/4257157.html
Copyright © 2011-2022 走看看