C# 什么设计模式最适合这种每个客户多个实现的方法?
我有客户,每个客户都有生成参考号的方法,但每个客户的参考号都不同。我在下面有一个实现,但我很好奇是否存在任何可伸缩性问题,这是什么设计模式,或者什么设计模式最适合这个场景:C# 什么设计模式最适合这种每个客户多个实现的方法?,c#,design-patterns,C#,Design Patterns,我有客户,每个客户都有生成参考号的方法,但每个客户的参考号都不同。我在下面有一个实现,但我很好奇是否存在任何可伸缩性问题,这是什么设计模式,或者什么设计模式最适合这个场景: //All customers will implement this. public interface ICustomer { } //All customers will implement this. public interface IReferenceNumber { string GenerateR
//All customers will implement this.
public interface ICustomer
{
}
//All customers will implement this.
public interface IReferenceNumber
{
string GenerateReferenceNumber();
}
public class CustomerOne : ICustomer, IReferenceNumber
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 1";
}
}
public class CustomerTwo : ICustomer, IReferenceNumber
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 2";
}
}
我可以这样称呼它:
Dictionary<string,ICustomer> customers = new Dictionary<string,ICustomer>();
customers.Add("CustomerOne",new CustomerOne());
customers.Add("CustomerTwo",new CustomerTwo());
CustomerOne customerOne = (CustomerOne)customers["CustomerOne"];
CustomerTwo customerTwo = (CustomerTwo)customers["CustomerTwo"];
Console.WriteLine(customerOne.GenerateReferenceNumber());
Console.WriteLine(customerTwo.GenerateReferenceNumber());
但如果每个客户都需要唯一的逻辑来生成参考号,除非我有多个
GenerateReferenceNumber
方法,或者一个巨大的if-else语句,或者客户的不同具体实现,可以使用默认的引用号或他们自己的唯一逻辑来生成一个,否则我怎么能只保留一个客户对象并重写行为。您可以移动将GenerateReferenceEnumber()方法转换为ICCustomer接口,并在字典中使用它,这要简单得多:
//All customers will implement this.
public interface ICustomer
{
string GenerateReferenceNumber();
}
public class CustomerOne : ICustomer
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 1";
}
}
public class CustomerTwo : ICustomer
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 2";
}
}
Dictionary<string,ICustomer> customers = new Dictionary<string,ICustomer>();
customers.Add("CustomerOne",new CustomerOne());
customers.Add("CustomerTwo",new CustomerTwo());
var customerOne = customers["CustomerOne"];
var customerTwo = customers["CustomerTwo"];
Console.WriteLine(customerOne.GenerateReferenceNumber());
Console.WriteLine(customerTwo.GenerateReferenceNumber());
然后用法是一样的-不需要强制转换
至于设计模式的问题,我没有看到任何具体的设计模式,应该在这里使用。这是继承的基本情况,而不是更复杂的行为,因为设计模式将其作为一般方法来实现。因此,无需将此代码与设计模式复杂化。您可以将GenerateReferenceEnumber()方法移动到ICCustomer接口,并在字典中使用它,这要简单得多:
//All customers will implement this.
public interface ICustomer
{
string GenerateReferenceNumber();
}
public class CustomerOne : ICustomer
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 1";
}
}
public class CustomerTwo : ICustomer
{
public string GenerateReferenceNumber()
{
return "Reference Implemenation 2";
}
}
Dictionary<string,ICustomer> customers = new Dictionary<string,ICustomer>();
customers.Add("CustomerOne",new CustomerOne());
customers.Add("CustomerTwo",new CustomerTwo());
var customerOne = customers["CustomerOne"];
var customerTwo = customers["CustomerTwo"];
Console.WriteLine(customerOne.GenerateReferenceNumber());
Console.WriteLine(customerTwo.GenerateReferenceNumber());
然后用法是一样的-不需要强制转换
至于设计模式的问题,我没有看到任何具体的设计模式,应该在这里使用。这是继承的基本情况,而不是更复杂的行为,因为设计模式将其作为一般方法来实现。因此,无需将此代码与设计模式复杂化。通过使用,我可以得出如下结论:
public class Customer
{
private readonly IReferenceNumberGetter ReferenceNumberGetter;
public Customer(IReferenceNumberGetter referenceNumberGetter)
{
ReferenceNumberGetter = referenceNumberGetter;
}
public string GenerateReferenceNumber()
{
return ReferenceNumberGetter.GenerateReferenceNumber();
}
// other Customer stuff
}
public interface IReferenceNumberGetter
{
string GenerateReferenceNumber();
}
public class ReferenceNumberGetterOne : IReferenceNumberGetter
{
public string GenerateReferenceNumber()
{
return "4";
}
}
public class ReferenceNumberGetterTwo : IReferenceNumberGetter
{
public string GenerateReferenceNumber()
{
return "42";
}
}
然后像这样使用它:
var customerOne = new Customer(new ReferenceNumberGetterOne());
var customerTwo = new Customer(new ReferenceNumberGetterTwo());
使用,我会想到这样的东西:
public class Customer
{
private readonly IReferenceNumberGetter ReferenceNumberGetter;
public Customer(IReferenceNumberGetter referenceNumberGetter)
{
ReferenceNumberGetter = referenceNumberGetter;
}
public string GenerateReferenceNumber()
{
return ReferenceNumberGetter.GenerateReferenceNumber();
}
// other Customer stuff
}
public interface IReferenceNumberGetter
{
string GenerateReferenceNumber();
}
public class ReferenceNumberGetterOne : IReferenceNumberGetter
{
public string GenerateReferenceNumber()
{
return "4";
}
}
public class ReferenceNumberGetterTwo : IReferenceNumberGetter
{
public string GenerateReferenceNumber()
{
return "42";
}
}
然后像这样使用它:
var customerOne = new Customer(new ReferenceNumberGetterOne());
var customerTwo = new Customer(new ReferenceNumberGetterTwo());
这可能只是类的措辞,但听起来应该只有一个Customer
类具有ReferenceNumber
属性,然后您实例化该类以获得customer1
,customer2
,如果我遗漏了什么,为什么要为每个客户创建一个类?如果你有100个客户,你真的要写100个类吗?@jbabey-如果每个客户都有一个不同的GetReferenceNumber实现呢?在我看来似乎有点像。我非常同意@jbabey的观点,你真的应该只有一个Customer
类。@ashburaczenko-这就是我试图避免的,因此,我提出这个问题的原因之一。我认为如果他们以不同的方式实现GetReferenceNumber,我需要创建多个具体的客户。这可能只是类的措辞,但听起来应该只有一个Customer
类具有ReferenceNumber
属性,然后实例化该类以获得customer1
,customer2
,我遗漏了一些东西,为什么要为每个客户创建一个类?如果你有100个客户,你真的要写100个类吗?@jbabey-如果每个客户都有一个不同的GetReferenceNumber实现呢?在我看来似乎有点像。我非常同意@jbabey的观点,你真的应该只有一个Customer
类。@ashburaczenko-这就是我试图避免的,因此,我提出这个问题的原因之一。我认为如果他们以不同的方式实现GetReferenceNumber,我需要创建多个具体的客户。很好,我删除了IReferenceNumber,并将GenerateReferenceNumber移到了ICustomer中。上面的一些评论指出了为什么我需要有多个客户,但是如果每个客户都有不同的生成参考号的逻辑,我不需要有多个类吗?如果您有不同的生成参考号的逻辑,您需要有多个类。但是,如果它仅仅是例示的非Irialial/Error,则应该将一个类的引用号作为字段/属性。如果您有公共逻辑,则考虑使用抽象基类代替/添加ICuutter接口。它将允许您重写所需的方法,或强制每个派生类以自己的方式实现此方法我刚才给出了一个简单的示例,但生成引用号的逻辑远远大于此,我只是想指出,GenerateReferenceEnumber会为不同的客户产生不同的值,得到这些值的逻辑也会不同。谢谢。好的,根据你对使用抽象类的评论,如果我错了请纠正我,你是说如果我有默认实现,最好使用抽象类,因为这样当一个具体对象实现我的抽象类时,他们就不需要像我使用接口一样实现每个方法,对吗?很好,我删除了iReferenceEnumber并将GenerateReferenceEnumber移动到ICustomer中。上面的一些评论指出了为什么我需要有多个客户,但是如果每个客户都有不同的生成参考号的逻辑,我不需要有多个类吗?如果您有不同的生成参考号的逻辑,您需要有多个类。但是,如果它仅仅是例示的非Irialial/Error,则应该将一个类的引用号作为字段/属性。如果您有公共逻辑,则考虑使用抽象基类代替/添加ICuutter接口。它将允许您重写所需的方法,或强制每个派生类以自己的方式实现此方法我刚才给出了一个简单的示例,但生成引用号的逻辑远远大于此,我只是想指出,GenerateReferenceEnumber会为不同的客户产生不同的值,得到这些值的逻辑也会不同。谢谢。好的,根据你对使用抽象类的评论,如果我错了,请纠正我,y