【设计模式】之 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()
三、一个形象的比喻
玉帝传美猴王上天
命令模式不是新的发明,在美猴王大闹天宫之前就有了。那时玉帝命令太白金星召美猴王上天:"金星径入(水帘洞)当中,面南立定道:'我是西方太白金星,奉玉帝招安圣旨,下界请你上大,拜受仙录。'"玉帝是系统的客户端,太白金星是命令的发出者,猴王是命令的接收者,圣旨就是命令。玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。果不然,不久美猴王就大闹了天宫。
这个模拟系统的设计如下:
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”(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()
三、一个形象的比喻
玉帝传美猴王上天
命令模式不是新的发明,在美猴王大闹天宫之前就有了。那时玉帝命令太白金星召美猴王上天:"金星径入(水帘洞)当中,面南立定道:'我是西方太白金星,奉玉帝招安圣旨,下界请你上大,拜受仙录。'"玉帝是系统的客户端,太白金星是命令的发出者,猴王是命令的接收者,圣旨就是命令。玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。果不然,不久美猴王就大闹了天宫。
这个模拟系统的设计如下:
相关文章推荐
- 设计模式之Command模式(学习笔记)
- [GoF设计模式]抽象工厂模式和Command模式的C++实现
- PHP设计模式:命令Command模式
- 我是如何学习设计模式的七:中介者模式—和command模式,观察者模式有一定关系
- 设计模式——command模式
- 设计模式学习笔记十五——Command模式
- 设计模式----Command模式
- 【JAVA】设计模式之命令模式(Command模式)的使用分析
- 设计模式-command模式
- 设计模式实战:在WinForm中用Command模式实现可以撤销的数据操作
- 设计模式----Command模式
- 设计模式-----COMMAND模式
- Command模式详解--设计模式(19)
- 常见设计模式的解析和实现(C++)之十四-Command模式
- 设计模式之command模式(看了好多文章,只有这篇让我豁然开朗。)
- 设计模式(c++)笔记之十九(Command模式)
- 设计模式学习之command模式
- 设计模式之Command模式(笔记)
- 设计模式:利用Command模式实现无限次数的Undo/Redo功能
- 设计模式:利用Command模式实现无限次数的Undo/Redo功能