【发布时间】:2018-04-28 09:16:44
【问题描述】:
我已经看过几个关于 SOLID 开闭原则的示例。这些解释通常很清楚。
但我心中还有一个问题,那就是我们如何在不使用条件语句的情况下初始化那些不同的类?
这里是示例代码:
public enum PreferredMeal
{
Vegetarian = 1,
NonVegetarian = 2
}
public class Customer
{
public string Name { get; set; }
public PreferredMeal PreferredMeal { get; set; }
}
public interface IMealGenerator
{
List<Meal> GenerateMeals(Customer customer);
}
public class VegetarianMealGenerator : IMealGenerator
{
public override List<Meal> GenerateMeals(Customer customer)
{
// Some codes here
}
}
public class NonVegetarianMealGenerator : IMealGenerator
{
public override List<Meal> GenerateMeals(Customer customer)
{
// Some codes here
}
}
假设我得到了以下数据,我被要求读取这些数据并为所有客户生成餐点。
Input(CustomerName, PreferredMeal):
Customer1,1
Customer2,1
Customer3,2
我们不是也要使用 if 语句来根据客户来确定要实例化哪个实现 MealGenerator 的类,如下所示?
// Let's assume this function is called after all customers data has been read
// And those data is passed here
public void GenerateCustomerMeals(List<Customer> customers)
{
foreach (var customer in customers)
{
if (customer.PreferredMeal == PreferredMeal.Vegetarian)
new VegetarianMealGenerator().GenerateMeals(customer);
else if (customer.PreferredMeal == PreferredMeal.NonVegetarian)
new NonVegetarianMealGenerator().GenerateMeals(customer);
}
}
如果是这样的话,那么 GenerateCustomerMeals 似乎不满足开闭原则。有没有更好的 SOLID 方法来做到这一点? :)
【问题讨论】:
标签: c# solid-principles open-closed-principle