概要
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
类图
运行
代码
using System;
namespace 命令模式
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Client client = new Client();
client.main();
Console.ReadLine();
}
}
// 抽象层
class InvokerTank
{
ICommand scmd;
ICommand rcmd;
public InvokerTank(ICommand scmd,ICommand rcmd)
{
this.scmd = scmd;
this.rcmd = rcmd;
}
public void sort()
{
this.scmd.execute();
}
public void run()
{
this.rcmd.execute();
}
}
interface ICommand
{
void execute();
}
class Receiver
{
public void sort()
{
Console.WriteLine("sort");
}
public void run()
{
Console.WriteLine("run");
}
}
// 实现层
class SortCommand : ICommand
{
Receiver receiver;
public SortCommand(Receiver receiver)
{
this.receiver = receiver;
}
public void execute()
{
this.receiver.sort();
}
}
class RunCommand : ICommand
{
Receiver receiver;
public RunCommand(Receiver receiver)
{
this.receiver = receiver;
}
public void execute()
{
this.receiver.run();
}
}
class Client
{
public void main()
{
Receiver receiver = new Receiver();
SortCommand sortCommand = new SortCommand(receiver);
RunCommand runCommand = new RunCommand(receiver);
InvokerTank tank = new InvokerTank(sortCommand, runCommand);
tank.sort();
tank.run();
}
}
}
代码优化
优化方向:消除冗余
1.加深了抽象,把请求和服务都做了一个接口抽象,因为是同步请求,说以请求和响应的接口是一样的;
2.命令行提取了一个基类,消除了两个server 成员变量的冗余。
3.添加量一个B70Receiver,增强了comand的可选择范围。
运行效果
代码
using System;
namespace 命令模式
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Client client = new Client();
client.main();
Console.ReadLine();
}
}
// 抽象层
interface IFunctions
{
void sort();
void run();
}
interface ICommand
{
void execute();
}
// 实现层
class InvokerTank: IFunctions
{
ICommand scmd;
ICommand rcmd;
public InvokerTank(ICommand scmd, ICommand rcmd)
{
this.scmd = scmd;
this.rcmd = rcmd;
}
public void sort()
{
this.scmd.execute();
}
public void run()
{
this.rcmd.execute();
}
}
class Receiver: IFunctions
{
public virtual void sort()
{
Console.WriteLine("sort");
}
public virtual void run()
{
Console.WriteLine("run");
}
}
class B70Receiver: Receiver
{
public override void sort()
{
Console.WriteLine("sort:70");
}
}
abstract class Command : ICommand
{
protected Receiver receiver;
protected Command(Receiver receiver)
{
this.receiver = receiver;
}
public abstract void execute();
}
class SortCommand : Command
{
public SortCommand(Receiver receiver):base(receiver){}
public override void execute()
{
this.receiver.sort();
}
}
class RunCommand : Command
{
public RunCommand(Receiver receiver):base(receiver){}
public override void execute()
{
this.receiver.run();
}
}
class Client
{
public void main()
{
Receiver receiver = new Receiver();
B70Receiver b70Receiver = new B70Receiver();
SortCommand sortCommand = new SortCommand(b70Receiver);
RunCommand runCommand = new RunCommand(receiver);
InvokerTank tank = new InvokerTank(sortCommand, runCommand);
tank.sort();
tank.run();
}
}
}