工厂方法 - 未知参数

时间:2015-08-18 13:40:25

标签: c# wpf

我第一次尝试使用命令模式,并创建了一个命令工厂,我按照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模型)因为我有多个不同的模型,它们没有共同的基类/接口

3 个答案:

答案 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中你可以添加列表或对象字典。

在此网站中,您可以找到源代码

link:http://www.dofactory.com/net/command-design-pattern

答案 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);
    }
}

话虽如此,我不完全确定你应该使用工厂,甚至可能不是这里的命令模式。