在此先感谢您的帮助。我想知道如果有一个(设计)的模式,可以应用于这个问题。

我找到分析、处理和提取出的数值从文文件具有类似,但不同的格式。

更具体地说,我建立一个处理引擎,接受在线扑克方面的历史文件,从众多不同的网站,并分析了具体的数据字段(手#、DateTime球员).我将需要在逻辑来分析的文件略有不同,对每一个格式,但所处理的提取价值观将是相同的。

我首先想到的是创建就1类,可接受一个"模式"对每个文件的类型和分析/工艺相应。我肯定有一个更好的解决方案。

谢谢!

奖励点: 任何特定的执行情况的提示。

有帮助吗?

解决方案

这听起来像一个候选人的战略模式。一个例子,在C#可以找到 在这里, 和另一个 在这里,.简要说明可以在 维基百科.

更完整的说明中提供的书 FowlerKerievsky.

它也可以从GoF书。

其他提示

"提供者的"模式是一个你要找的...它用的是什么ADO.Net.每个数据库供应商具有一个独立的数据"供应商","知道"如何读取的数据的特定数据库的供应商的产品,但提供了这一标准格式(接口)的以下行系统...你会写一本小"提供者"的组成部分(一个单一的类将满足),"知道"格式为每个不同的网站扑克的历史数据提供商,并公开这些数据完全相同的方式向上游系统,读取它...

听起来你需要的战略模式,这可以让你实现一个算法的一些不同的方式:

http://en.wikipedia.org/wiki/Strategy_pattern

第一,创造你的"在线扑克历史手" 模型.这个模型将表示的数据,并将能够处理这些数据独立从来源。然后创建 供应商 对于每个不同来源的格式必须能够转换文件中的信息纳入模型。

编辑:例如

public interface IDataProvider
{
    IOnlinePokerInfo ParseFileInformation(FileInfo input);
}

public interface IOnlinePokerInfo
{
    int Hand { get; set; }
    DateTime DateInfo { get; set; }
    List<IPlayer> Players { get; set; }
    void ProcessInformation();
}

public interface IPlayer
{
    string Name { get; set; }
}

public class MyOnlinePokerInfo : IOnlinePokerInfo
{
    private int hand;
    private DateTime date;
    private List<IPlayer> players;

    public int Hand { get { return hand; } set { hand = value; } }
    public DateTime DateInfo { get { return date; } set { date = value; } }
    public List<IPlayer> Players { get { return players; } set { players = value; } }

    public MyOnlinePokerInfo(int hand, DateTime date)
    {
        this.hand = hand;
        this.date = date;
        players = new List<IPlayer>();
    }

    public MyOnlinePokerInfo(int hand, DateTime date, List<IPlayer> players)
        : this(hand, date)
    {
        this.players = players;
    }

    public void AddPlayer(IPlayer player)
    {
        players.Add(player);
    }

    public void ProcessInformation()
    {
        Console.WriteLine(ToString());
    }

    public override string ToString()
    {
        StringBuilder info = new StringBuilder("Hand #: " + hand + " Date: " + date.ToLongDateString());
        info.Append("\nPlayers:");
        foreach (var s in players)
        {
            info.Append("\n"); 
            info.Append(s.Name);
        }
        return info.ToString();
    }
}

public class MySampleProvider1 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(1, DateTime.Now);
        IPlayer p = new MyPlayer("me");
        info.AddPlayer(p);
        return info;
    }
}

public class MySampleProvider2 : IDataProvider
{
    public IOnlinePokerInfo ParseFileInformation(FileInfo input)
    {
        MyOnlinePokerInfo info = new MyOnlinePokerInfo(2, DateTime.Now);
        IPlayer p = new MyPlayer("you");
        info.AddPlayer(p);
        return info;
    }
}

public class MyPlayer : IPlayer
{
    private string name;
    public string Name { get { return name; } set { name = value; } }

    public MyPlayer(string name)
    {
        this.name = name;
    }
}

public class OnlinePokerInfoManager
{
    static void Main(string[] args)
    {
        List<IOnlinePokerInfo> infos = new List<IOnlinePokerInfo>();

        MySampleProvider1 prov1 = new MySampleProvider1();
        infos.Add(prov1.ParseFileInformation(new FileInfo(@"c:\file1.txt")));

        MySampleProvider2 prov2 = new MySampleProvider2();
        infos.Add(prov2.ParseFileInformation(new FileInfo(@"c:\file2.log")));

        foreach (var m in infos)
        {
            m.ProcessInformation();
        }
    }
}

你也可以考虑使用 命令图案 在那里你将会有一个行动达到时间的文件类型,你需要的过程。这样你可以有灵活性对于所有的格式和遵守一致的参数,过程将要求。

另一个好处是,可以创建新的行动对于每个新格式的文件没有重构的代码的其他格式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top