簡體   English   中英

哪種設計模式最適合每種客戶方法的多種實現方式?

[英]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());

以下是一些更具體的問題:

  1. 我擁有ICustomer的唯一原因是,我不必做像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM