命令模式与负责任的命令

时间:2013-11-06 06:51:42

标签: c# design-patterns command

好吧,我正在尝试实现命令模式来创建与对象的交互。

几乎所有要创建的命令都包含对对象的请求和该对象的响应。

所以问题是 - 如何管理这些回复?

当所有命令都无效时,它很容易制作。无论它们是什么,如果它们实现@ executable @ interface,你都可以执行它们,所以有

void执行(对象参数)

但是当他们的回答有不同的类型时该怎么办?也许命令模式不适合这个项目?

3 个答案:

答案 0 :(得分:0)

ICommandResponse Execute(object params)

您可以返回具有ResponseType属性的接口,该属性为您提供有关具体响应类型的信息。

答案 1 :(得分:0)

使用.NET的内置命令模式类型和lambdas。

首先,你不需要自己的命令patetrn接口。使用Action<T>。因此,例如,任何被调用的命令必须具有以下签名:

void Command(object params)

然后,对于任何不是这种形式的命令,为它提供一个lambda垫片,例如:

() => { SomeCommandThatTakesTwoParamsAndRetrunsInt(parms.part1, params.part2); }

上面的lambda符合void Command(object params)要求。

答案 2 :(得分:0)

命令执行结果可能是事件。

示例:

class ChangeNameCommand
{
    int _id;
    string _name;
    IRepository _repository;
    IEventPublisher _publisher;

    public ChangeNameCommand(int id, string name, IRepository repository, IEventPublisher publisher)
    {
        _id = id;
        _name = name;
        _repository = repository;
        _publisher = publisher;
    }

    public void Execute()
    {
        User user = _repository.Get(_id)
        user.Name = _name;
        _repository.Save(user);

        NameChangedEvent e = new NameChangedEvent();
        _publisher.Publish(e);
    }
}

class UserNameChanged : IHandler<NameChangedEvent>
{
    public void Handle(NameChangedEvent e)
    {
        //TODO...
    }
}