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

    命令模式(Command)的目标是将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排除,记录请求日志,并支持撤消操作。 结构图如下:


    其实现思想是将一个请求封装到一个类中(Command),再提供接收对象(Receiver),最后Command命令由Invoker调用。 

    以一个电灯开关为例,命令的执行、不执行相对于开关的打开、关闭操作,由开关发出命令,电灯接收命令,结构图如下:


    实现代码:

    //Light.h
    class Light  
    {
    public:
        Light();
        
    virtual ~Light();

        
    void TurnOn();
        
    void TurnOff();
    };

    //Light.cpp
    #include "stdafx.h"
    #include 
    "Light.h"
    #include 
    <iostream>

    using namespace std;

    Light::Light()
    {

    }

    Light::
    ~Light()
    {

    }

    void Light::TurnOn()
    {
        cout 
    << "电灯打开了" << endl;
    }

    void Light::TurnOff()
    {
        cout 
    << "电灯关闭了" << endl;
    }

    //Command.h
    class Command  
    {
    public:
        
    virtual ~Command();

        
    virtual void Execute() = 0;
        
    virtual void UnExecute() = 0;
    protected:
        Command();
    };

    //Command.cpp
    #include "stdafx.h"
    #include 
    "Command.h"

    Command::Command()
    {
        
    }

    Command::
    ~Command()
    {

    }

    //LightCommand.h
    #include "Command.h"

    class Light;
    class LightCommand : public Command
    {
    public:
        LightCommand(Light
    *);
        
    virtual ~LightCommand();

        
    void Execute();
        
    void UnExecute();
    private:
        Light
    * m_pLight;
    };

    //LightCommand.cpp
    #include "stdafx.h"
    #include 
    "LightCommand.h"
    #include 
    "Light.h"

    LightCommand::LightCommand(Light
    * pLight)
    {
        m_pLight 
    = pLight;
    }

    LightCommand::
    ~LightCommand()
    {
        
    if(m_pLight != NULL)
        {
            delete m_pLight;
            m_pLight 
    = NULL;
        }
    }

    void LightCommand::Execute()
    {
        m_pLight
    ->TurnOn();
    }

    void LightCommand::UnExecute()
    {
        m_pLight
    ->TurnOff();
    }

    //Switch.h
    class Command;
    class Switch  
    {
    public:
        Switch(Command
    *);
        
    virtual ~Switch();

        
    void Open();
        
    void Close();
    private:
        Command
    * m_pCommand;
    };

    //Switch.cpp
    #include "stdafx.h"
    #include 
    "Switch.h"
    #include 
    "Command.h"

    Switch::Switch(Command
    * pCommand)
    {
        m_pCommand 
    = pCommand;
    }

    Switch::
    ~Switch()
    {

    }

    void Switch::Open()
    {
        m_pCommand
    ->Execute();
    }

    void Switch::Close()
    {
        m_pCommand
    ->UnExecute();
    }

    //main.cpp
    #include "stdafx.h"
    #include 
    "Switch.h"
    #include 
    "Light.h"
    #include 
    "LightCommand.h"

    int main(int argc, char* argv[])
    {
        Light
    * pLight = new Light;
        Command
    * pCommand = new LightCommand(pLight);
        Switch
    * pSwitch = new Switch(pCommand);
        pSwitch
    ->Open();
        pSwitch
    ->Close();
        
    return 0;
    }


    最后输出为:
    电灯打开了
    电灯关闭了

  • 相关阅读:
    SQL SERVER 2008 SA禁用,Windows帐户被删
    SQL Server表结构修改脚本
    请教高手,如何取得Target属性
    Installing Reporting Services on Windows 7, Vista or Windows Server 2008 无权限(rsAccessDenied)解决方法
    请教:如何在子页面关闭时把焦点设置到父页面的服务器控件上?
    order by newid() sql随机查询
    JS干货,笔记大全
    破解XP密码
    直接连接*.mdf 文件 获取随机数据
    总结C#获取当前路径的7种方法(转)
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2418319.html
Copyright © 2011-2022 走看看