战略模式对这种情况有帮助吗?

时间:2011-09-30 01:47:29

标签: c# design-patterns strategy-pattern

我有两个班A&amp; B和这两个类实现了接口ISomeInterface。但是A类和A类都不需要一些属性。 B. 但在客户端应用程序中,我调用相同的ISomeInterface来调用这两个类。我遇到的问题是我不想要Dictionary<string, string>&amp;同一接口中的TypedDataSet,IList<Record>属性。但是客户端需要使用这个IsomeInterface。

实际上DataValues()属性仅适用于A类。 类似地,MetaData()和RecordCollection()属性适用于B类。 另外,如果我将来引入一个新的C类,并且需要一个像这样的单独属性,那么我的代码看起来很难看,我不想要。 那么,有什么方法我仍然可以在我的客户端应用程序中使用相同的IsomeInterface并在相应的类中具有相应的属性? 我认为我需要使用策略设计模式,但对如何实现相同感到困惑。如果我错了,请纠正我?

见下文:

interface ISomeInterface
{
 string Id{get; set;}
 void Display();
 Dictionary<string, string> DataValues{get;};
 TypedDataSet MetaData{get; }
 IList<Record> RecordCollection{get; }
}

public class A: ISomeInterface
{
public string Id 
{
        return "A1";
}

void Display()
{   
    Console.Writeline("class A");
}

public Dictionary<string, string> DataValues()
{
    return new Dictionary<string, string>();
}


public TypedDataSet MetaData()
{
    //I dont want this method for class A
    throw new NotImplementedException();
}

public IList<Record> RecordCollection()
{
    //I dont want this method for class A
    throw new NotImplementedException();
}
}


public class B: ISomeInterface
{
public string Id 
{
        return "B1";
}

void Display()
{   
    Console.Writeline("class B");
}

public Dictionary<string, string> DataValues()
{
    //I dont want this method for class B
    throw new NotImplementedException();
}

public TypedDataSet MetaData()
{
    return new TypedDataSet();
}

public IList<Record> RecordCollection()
{
    IList<Record> rc = null;

    //do something
    return rc;
}
 }

客户端应用程序 -

Main()
{
ISomeInterface a = new A();
a.Display();
Dictionary<string, string> data = a.DataValues();

ISomeInterface b = new B();
b.Display();
TypedDataSet data = b.MetaData();
IList<Record> rc = b.RecordCollection();
}

2 个答案:

答案 0 :(得分:1)

在这种情况下,策略并不适合你。

我们必须质疑为什么当它的实现类不支持所有方法时必须调用ISomeInterface。最好有几个继承接口。

  • ISomeInterface
    • IClassAInterface
    • IClassBInterface

然后,选择最适合使用的接口。

interface ISomeInterface
{
   string Id{get; set;}
   void Display();
}
interface IClassAInterface
{
   Dictionary<string, string> DataValues{get;};
}
interface IClassBInterface
{
   TypedDataSet MetaData{get; }
   IList<Record> RecordCollection{get; }
}

您给出的示例用法并不真正有用 - 您已经知道要实例化的是哪个类(新的A()和新的B()),因此接口不会为您提供任何添加的抽象。因此,让我们想一个这种技术更有用的例子:

public class SomeCollection
{
   public ICollection<T> retrieveItems<T>() where T : ISomeInterface
   {
       //... retrieve relevant instances.
   }
}

然后

var col = new SomeCollection();
// Populate... 
var someInterfaces = col.retrieveItems<ISomeInterface>();
foreach(ISomeInterface instance in someInterfaces){
   instance.Display();
}

var classAInterfaces = col.retrieveItems<IClassAInterface>();
// etc.

所以我想最后,如果你想从As和B的集合中获得一堆“RecordCollection”,你真的需要重新考虑你的设计。

答案 1 :(得分:0)

这里适用的软件设计原则是不应强制类实现它们不会使用的接口方法。因此,接口应该只有方法和属性,所有实现该接口的类都将使用它。

除此之外,我认为这很大程度上取决于您尝试在您的域和现有应用程序中建模的内容,以及您选择何种解决方案。即需要更具体的信息来提供进一步的建议。