命令模式(Command Pattern)

本文介绍命令模式的基本概念,包括其组成部分如抽象命令、具体命令、接收者及请求者的职责。通过一个示例展示如何使用命令模式解耦请求发送者与接收者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        命令模式可以在一个对象中封装一个请求,把方法调用作为对象进行管理,并在满足时序关系或是满足某些条件的情况下,传递这些对象,并且调用这些对象。在实际应用中将命令抽象成一个接口,所有的命令都实现这个接口,具体命令角色实现接口规定的方法.对象的请求者(Invoker)和命令对象是弱耦合关系, 和接收者(Reciever)都不过问命令的执行过程。命令模式可以作为模板方法的一个替代方案,同时命令模式经常要与中介者模式和备忘录模式协同工作。

        命令模式把发出命令的责任和执行命令的责任分开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

        应用命令模式的一个典型例子就是菜单。菜单项知道何时需要执行一个动作,但是不知道应该调用哪个方法,通过命令模式可以确定对应与每个菜单标记的方法调用。

       一个简单的示例如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace CommandPattern
{
    
/// <summary>
    
/// 抽象命令角色类:所有具体命令类实现它规定的抽象方法。
    
/// </summary> 

    abstract class Command
    
{
        
/// <summary>
        
/// 接收者
        
/// </summary>

        protected Receiver receiver;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="receiver">接收者</param>

        public Command(Receiver receiver)
        
{
            
this.receiver = receiver;
        }


        
/// <summary>
        
/// 抽象的执行方法
        
/// </summary>

        abstract public void Execute();
    }


    
/// <summary>
    
/// 具体命令(PrintCommand)角色类一:定义一个接受者和行为之间的弱耦合,实现Execute()方法。
    
/// </summary>

    class PrintCommand : Command
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="receiver"></param>

        public PrintCommand(Receiver receiver)
            : 
base(receiver)
        

        }


        
/// <summary>
        
/// 执行方法
        
/// </summary>

        public override void Execute()
        
{
            receiver.Print();
        }

    }


    
/// <summary>
    
/// 具体命令(PrintCommand)角色类二:定义一个接受者和行为之间的弱耦合,实现Execute()方法。
    
/// </summary>

    class CopyCommand : Command
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="receiver"></param>

        public CopyCommand(Receiver receiver)
            : 
base(receiver)
        
{
        }


        
/// <summary>
        
/// 执行方法
        
/// </summary>

        public override void Execute()
        
{
            receiver.Copy();
        }

    }


    
/// <summary>
    
/// 接收者(Receiver)角色类:定义请求执行的方法
    
/// </summary>

    class Receiver
    
{
        
/// <summary>
        
/// 打印
        
/// </summary>

        public void Print()
        
{
            Console.WriteLine(
"打印!");
        }


        
/// <summary>
        
/// 复印
        
/// </summary>

        public void Copy()
        
{
            Console.WriteLine(
"复印!");
        }

    }


    
/// <summary>
    
/// 请求者(Invoker)角色:负责调用命令对象执行请求的方法。
    
/// </summary>

    class Invoker
    
{
        
private Command _printCommand;
        
private Command _copyCommand;

        
/// <summary>
        
/// 打印命令
        
/// </summary>

        public Command PrintCommand
        
{
            
get
            
{
                
return _printCommand;
            }

            
set
            
{
                _printCommand 
= value;
            }

        }


        
/// <summary>
        
/// 复印命令
        
/// </summary>

        public Command CopyCommand
        
{
            
get
            
{
                
return _copyCommand;
            }

            
set
            
{
                _copyCommand 
= value;
            }

        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="printCommand">打印命令</param>
        
/// <param name="copyCommand">复印命令</param>

        public Invoker(Command printCommand, Command copyCommand)
        
{
            
this._printCommand = printCommand;
            
this._copyCommand = copyCommand;
        }


        
/// <summary>
        
/// 打印
        
/// </summary>

        public void Print()
        
{
            _printCommand.Execute();
        }


        
/// <summary>
        
/// 复印
        
/// </summary>

        public void Copy()
        
{
            _copyCommand.Execute();
        }

    }
 

    
class Program
    
{
        
static void Main(string[] args)
        
{
            Receiver receiver 
= new Receiver();

            Command printCommand 
= new PrintCommand(receiver);
            Command copyCommand 
= new CopyCommand(receiver);

            Invoker invoker 
= new Invoker(printCommand, copyCommand);
            invoker.Print();
            invoker.Copy();

            Console.ReadLine();
        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值