哪种设计模式适合使用?

时间:2020-12-20 12:51:14

标签: c# design-patterns

我真的不想发布这个问题,但我已经有几天没有想法了。在我的大学里,我被赋予了使用设计模式来“解决”一些任务的任务。

这是我坚持的任务(翻译):

<块引用>

售货亭有 2 台出售鸡尾酒的自动售货机。一种包含几种含酒精的鸡尾酒,另一种是不含酒精的替代品。根据买家的年龄分配酒精或非酒精鸡尾酒。

我已经做了 2 个解决方案,但没有一个有设计模式。我正在考虑创建模式,但从它的使用示例来看,我认为它不是一个好的选择。还考虑了战略、调解人、责任链、门面和桥梁,但在我看来,它也不适合这里。

另外,另外一个问题是我在两周前才开始学习模式,所以仍然很不擅长使用它们。

我什至不关心代码的质量,我只想以适当的模式完成这项任务并继续我的正常学习,而不是强迫我使用任何不需要的东西。

我可以在我的情况下使用什么设计模式?

这是我最后一次尝试

public class Kiosk
{
    private readonly Dispenser _alcoholicDispenser = new Dispenser(), _nonAlcoholicDispenser = new Dispenser();

    public void AddCocktail(string name, CocktailRecipe alcoholicRecipe, CocktailRecipe nonAlcoholicRecipe)
    {
        _alcoholicDispenser.AddCocktail(new Cocktail(name, true, alcoholicRecipe));
        _nonAlcoholicDispenser.AddCocktail(new Cocktail(name, false, nonAlcoholicRecipe));
    }

    public bool RemoveCocktail(string name)
    {
        if (!_alcoholicDispenser.RemoveCocktail(name)) 
            return false;

        _nonAlcoholicDispenser.RemoveCocktail(name);
        return true;
    }

    public Cocktail GetCocktail(Person person, string cocktailName)
    {
        if (person.Age < 18) 
            return _nonAlcoholicDispenser.Dispence(cocktailName);
        else 
            return _alcoholicDispenser.Dispence(cocktailName);
    }
}

public class Dispenser
{
    private readonly Dictionary<string, Cocktail> _cocktails = new Dictionary<string, Cocktail>();

    public void AddCocktail(Cocktail cocktail)
    {
        _cocktails.Add(cocktail.Name, cocktail);
    }

    public bool RemoveCocktail(string cocktailName)
    {
        return _cocktails.Remove(cocktailName);
    }

    public Cocktail Dispence(string cocktailName)
    {
        return _cocktails[cocktailName];
    }
}

public class Cocktail
{
    public string Name { get; set; }
    public bool Alcoholic { get; set; }
    public CocktailRecipe Recipe { get; set; }

    public Cocktail(string name, bool alcoholic, CocktailRecipe recipe)
    {
        Name = name;
        Alcoholic = alcoholic;
        Recipe = recipe;
    }

    public override string ToString()
    {
        string res = "Name:" + Name + "(" + (Alcoholic ? "alcoholic" : "non-alcoholic") + ")";
        return res;
    }
}

public class CocktailRecipe
{
    public List<Ingredient> Ingredients { get; set; }
}

public class Ingredient
{
    public string Name { get; set; }
    public double Volume { get; set; }

    public Ingredient(string name, double volume)
    {
        Name = name;
        Volume = volume;
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var kiosk = new Kiosk();

        kiosk.AddCocktail("Mojito", new CocktailRecipe(), new CocktailRecipe());

        var majorPerson = new Person("Tom", 20);
        var minorPerson = new Person("Jimmy", 17);

        Console.WriteLine(kiosk.GetCocktail(majorPerson, "Mojito"));
        Console.WriteLine(kiosk.GetCocktail(minorPerson, "Mojito"));

        Console.ReadKey();
    }
}

1 个答案:

答案 0 :(得分:1)

我建议使用 Factory Method 模式。请记住,在 GoF 中没有工厂模式,只有工厂方法和抽象工厂模式。

我不会给你解决方案,但我会在这里提供细节。

  1. 在您的 Kiosk 项目中,您需要创建两个 私有 Dispenser 对象(这是您的抽象 Creator
  2. AlchoholicDispenser 创建为具体的 Creator,将 NonAlchoholicDispenser 创建为其他具体的 Creator。稍后,您还可以创建 ChocolateDispenser 和许多其他内容。
  3. 在您的信息亭内,创建一个 if/else 子句,并根据请求者选择您选择的 Dispenser 对象。

稍后,您可能希望创建一个 Dictionary<ItemType, Dispenser> 创建服务函数:kiosk.Serve(ItemType.NonAlchoholic)

代码看起来像

public Beverage Serve(ItemType type) {
    dispenserDict[type].CreateItem();
}
相关问题