我第一次尝试使用命令模式,并创建了一个命令工厂,我按照pluralsight.com课程的指导,在那里他为工厂实现了一个接口,包括一个MakeCommand方法。
现在我的问题来自于他只是传递一个字符串数组作为此方法的参数(他是一个命令行应用程序),但我的命令将使用各种类型的各种参数,我的计划是使用这些命令来存储模型的更新,因此如果应用程序无法连接到服务,则命令将在连接返回时排队等。
对于我来说,对于通用接口来说,这一直是一个棘手的问题,我如何处理大量可能的参数?
我的第一个想法是传递模型本身,使用命令类型(删除,更新等)的简单字符串参数,但是因为我的模型没有任何公共基类或接口,所以我只剩下一个类似的问题。
我错过了一些基本的东西吗?
编辑:请求我的问题示例。
我有一个CommandFactory接口
public interface ICommandFactory
{
string CommandName { get; }
string Description { get; }
ICommand MakeCommand( ..arguments.. )
}
我有简单的模型,如(纯粹的例子)
public class Model1
{
public string Name {get;set;}
public int Age {get;set;}
}
public class Model2
{
public DateTime Time {get;set;}
public double Price {get;set}
}
如果我想创建一个例如更新了model1的命令,我想知道界面的MakeCommand应该是什么样子,我不能做MakeCommand(字符串cmdType,Model1模型)因为我有多个不同的模型,它们没有共同的基类/接口
答案 0 :(得分:1)
您希望各个模型定义如何更新它们。在这种情况下,您是否可以将函数/操作从模型传递给MakeCommand?
public class Model
{
public string Name {get;set;}
public int Age {get;set;}
public void UpdateModel() {...}
}
public interface ICommandFactory
{
string CommandName { get; }
string Description { get; }
ICommand MakeCommand(Action<Model>);
ICommand MakeCommandFunc(Func<Model, bool>);
}
public class Command : ICommand
{
Action<Model> _action;
Command(Action<Model> action)
{
_action = action;
}
Execute()
{
_action();
}
}
编辑: 根据要求,使用通用接口类来为所有类建模
public interface IModel
{
void UpdateModel();
}
public class Model1 : IModel
{
public string Name {get;set;}
public int Age {get;set;}
// implement updating of the model
public void UpdateModel() {...do model update...}
}
public class Model2 : IModel
{
public DateTime Time {get;set;}
public double Price {get;set}
// 'dummy' implement updating of the model if this model does not supports updating
public void UpdateModel() { // do nothing or throw NotImplementedException(); }
}
public interface ICommandFactory
{
string CommandName { get; }
string Description { get; }
ICommand MakeCommand( IModel model );
}
答案 1 :(得分:0)
我建议你使用命令模式,这个模式使用receiver作为包含参数的对象,在receiver
中你可以添加列表或对象字典。
在此网站中,您可以找到源代码
答案 2 :(得分:0)
你也可以像这样使ICommandFactory接口通用:
public interface ICommandGeneric
{
void execute();
}
public class CommandOnModel1 : ICommandGeneric
{
private Model1 model;
public CommandOnModel1(Model1 model)
{
this.model = model;
}
public void execute()
{
System.Diagnostics.Debug.WriteLine(model.ToString());
}
}
public interface ICommandFactory <in ModelType>
{
string CommandName { get; }
string Description { get; }
ICommandGeneric MakeCommand(ModelType model, string parameter1);
}
public class Model1
{
}
public class Model1CommandFactory : ICommandFactory<Model1>
{
public string CommandName
{
get { return "CommandOnModel1"; }
}
public string Description
{
get { return "I do stuff on Model1"; }
}
public ICommandGeneric MakeCommand(Model1 model, string parameter1)
{
return new CommandOnModel1(model);
}
}
话虽如此,我不完全确定你应该使用工厂,甚至可能不是这里的命令模式。