您的位置:首页 > 其它

【设计模式】之 Command模式

2008-11-04 14:30 302 查看
引子

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”(A对象中某个方法调用B对象的某个方法,A和B是紧耦合)

要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。

所以我们要用模式来 隔离变化 (引入一个间接层C,隔离A和B的紧耦合,一般都是这么做的)

A. 来看一个一般化的代码

示意性代码

// Command pattern -- Structural example

using System;

namespace DoFactory.GangOfFour.Command.Structural

{

// MainApp test applicatio

class MainApp

{

static void Main()

{

// Create receiver, command, and invoker

Receiver receiver = new Receiver();

Command command = new ConcreteCommand(receiver);

Invoker invoker = new Invoker();

// Set and execute command

invoker.SetCommand(command);

invoker.ExecuteCommand();

// Wait for user

Console.Read();

}

}

// "Command"

abstract class Command

{

protected Receiver receiver;

// Constructor

public Command(Receiver receiver)

{

this.receiver = receiver;

}

public abstract void Execute();

}

// "ConcreteCommand"

class ConcreteCommand : Command

{

// Constructor

public ConcreteCommand(Receiver receiver) :

base(receiver)

{

}

public override void Execute()

{

receiver.Action();

}

}

// "Receiver"

class Receiver

{

public void Action()

{

Console.WriteLine("Called Receiver.Action()");

}

}

// "Invoker"

class Invoker

{

private Command command;

public void SetCommand(Command command)

{

this.command = command;

}

public void ExecuteCommand()

{

command.Execute();

}

}

}
Output

Called Receiver.Action()

三、一个形象的比喻

玉帝传美猴王上天

命令模式不是新的发明,在美猴王大闹天宫之前就有了。那时玉帝命令太白金星召美猴王上天:"金星径入(水帘洞)当中,面南立定道:'我是西方太白金星,奉玉帝招安圣旨,下界请你上大,拜受仙录。'"玉帝是系统的客户端,太白金星是命令的发出者,猴王是命令的接收者,圣旨就是命令。玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。果不然,不久美猴王就大闹了天宫。

这个模拟系统的设计如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: