Я видел пару примеров по принципу SOLID Open Close. И эти объяснения обычно довольно ясны.
Но у меня все еще есть еще один вопрос: как мы можем инициализировать эти разные классы без использования условного оператора?
Вот пример кода:
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, похоже, не удовлетворяет принципу открытого закрытия. Есть ли лучший твердый способ сделать это? :)