策略模式对这个场景有帮助吗?

本文关键字:有帮助 模式 策略 | 更新日期: 2023-09-27 18:10:09

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

实际上datvalues()属性只适用于类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;
}
 }

客户端App -

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();
}

策略模式对这个场景有帮助吗?

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

我们必须质疑为什么在它的实现类不支持所有方法的情况下必须调用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; }
}

你给出的示例用法并没有真正的帮助——你已经知道你实例化的是哪个类(new A()和new 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.

所以我猜最后,如果你想从a和b的集合中得到一堆"RecordCollection",你真的需要重新考虑你的设计

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

除此之外,我认为这在很大程度上取决于你想在你的领域和你现有的应用程序中建立什么模型,等等,以及你选择什么样的解决方案。也就是说,需要更具体的信息才能给出进一步的建议