[英]What design pattern best fits this multiple implementations per customer method?
我有客戶,每個客戶都有一種生成參考號的方法,但是每個客戶的參考號不同。 我在下面有一個實現,但是我很好奇是否存在任何可伸縮性問題,這是什么設計模式,或者哪種設計模式最適合這種情況:
//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());
以下是一些更具體的問題:
Dictionary<string,object> customers = new Dictionary<string,object>()
之類的IReferenceNumber
,但是現在我想知道是否IReferenceNumber
是不必要的, GenerateReferenceNumber
應該是移至ICustomer
另外,我討厭不得不做CustomerOne customerOne = (CustomerOne)customers["CustomerOne"];
。 有沒有一種方法可以讓我返回Customer並在其上調用方法而無需顯式強制轉換?
根據評論看來,我應該像這樣:
public class Customer
{
public string GenerateReferenceNumber()
{
//Logic
return "Default reference number";
}
}
但是,如果每個客戶都需要唯一的邏輯來生成參考號,那么除非我有多個GenerateReferenceNumber
方法或one huge if else statement
或可以使用默認參考號different concrete implementations of customers
否則如何只保留一個Customer對象並覆蓋行為?或自己產生的邏輯。
您可以將GenerateReferenceNumber()方法移至ICustomer接口,並在字典中使用它更加簡單:
//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());
或者,如果您確實想保留兩個接口,則可以使ICustomer繼承自IReferenceNumber:
public interface ICustomer : IReferenceNUmber
{
}
然后用法是一樣的-不需要強制轉換。
至於設計模式問題,我看不到這里應使用的任何特定設計模式。 它是繼承的基本情況,而不是更復雜的行為,后者具有將其實現為一般方法的設計模式。 因此,無需將此代碼與設計模式復雜化。
在繼承上使用Composition ,我會想到這樣的東西:
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.