行为型模式-命令模式

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


namespace 命令模式
{
/*
* 命令模式意图:见一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
*
* 命令模式优点:1、实现类间的解调,调用者与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可,而无需了解到底是哪个接受者执行
* 2、实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。
* 3、命令模式结合其他模式会更优秀,如和责任链模式,实现命令族的解析任务
*
* 命令模式缺点:1、若有N个命令,则具体command子类则膨胀,此时可以结合模板方法使用
* 2、命令模式增加了方法之间的调用复杂度。
*
* 命令模式使用场景:1、中的来说,只要有可以定义为命令的地方都可以使用。
* 2、需要在不同的时间指定请求、将请求排队。
* 3、使用命令模式作为"CallBack"在面向对象系统中的替代
* 4、系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,
* 可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,
* 再重新实施命令效果。
* 5、如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。
*/


///<summary>
/// 抽象出命令的执行体或声明一个接口,用于执行操作
///</summary>
publicabstractclass Command
{
protected Receiver reciever =null;
public Command(Receiver reciever)
{
this.reciever = reciever;

}
publicabstractvoid Execute();
}

///<summary>
/// 具体的命令类,将一个接收者对象绑定到一个动作
///</summary>
publicclass ConcreteCommand : Command
{
public ConcreteCommand(Receiver reciever)
:
base(reciever)
{

}
publicoverridevoid Execute()
{
this.reciever.Action();
}
}

///<summary>
/// 知道如何执行一个请求相关的操作的类
///</summary>
publicclass Receiver
{
publicvoid Action()
{
//具体的命令执行方法
}
}

///<summary>
/// 要求命令执行一个请求
///</summary>
publicclass Invoker
{
private Command command=null;
publicvoid SetCommand(Command comd)
{
this.command = comd;
}
///<summary>
/// 执行命令
///</summary>
publicvoid ExecuteCommand()
{
this.command.Execute();
}
}

publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
//创建
Receiver receiver =new Receiver();
Command command
=new ConcreteCommand(receiver);
Invoker invoker
=new Invoker();

// 设置命令和执行命令

invoker.SetCommand(command);
invoker.ExecuteCommand();



}
}
}
posted @ 2011-03-22 22:37  日月之明  阅读(341)  评论(0编辑  收藏  举报