C# 哪种设计模式适合使用?

C# 哪种设计模式适合使用?,c#,design-patterns,C#,Design Patterns,我真的不想发布这个问题,但我已经好几天没有想法了。在我的大学里,我的任务是使用设计模式来“解决”一些任务 这是我一直坚持的任务(翻译): 这个售货亭有两台自动售货机和鸡尾酒。一种是含酒精的鸡尾酒,另一种是它们的非酒精替代品。根据买家的年龄,分发含酒精或不含酒精的鸡尾酒 我已经提出了两个解决方案,但都没有设计模式。我在考虑创造模式,但从使用的例子来看,我认为这不是一个好的选择。还考虑了战略、调解人、责任链、门面和桥梁,但在我看来,这并不适合这里 另外,另一个问题是我在两周前才开始学习模式,所以在使

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

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

这个售货亭有两台自动售货机和鸡尾酒。一种是含酒精的鸡尾酒,另一种是它们的非酒精替代品。根据买家的年龄,分发含酒精或不含酒精的鸡尾酒

我已经提出了两个解决方案,但都没有设计模式。我在考虑创造模式,但从使用的例子来看,我认为这不是一个好的选择。还考虑了战略、调解人、责任链、门面和桥梁,但在我看来,这并不适合这里

另外,另一个问题是我在两周前才开始学习模式,所以在使用模式方面仍然很差

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

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

这是我最后一次尝试

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();
    }
}
公共类信息亭
{
专用只读分配器\u酒精分配器=新分配器(),\u非酒精分配器=新分配器();
公共无效添加鸡尾酒(字符串名称、鸡尾酒配方酒精浓度、鸡尾酒配方非酒精浓度)
{
_酒精分配器。添加鸡尾酒(新鸡尾酒(名称、真实、酒精浓度);
_非酒精饮料添加鸡尾酒(新鸡尾酒(名称,错误,非酒精饮料));
}
公共bool RemoveCocktail(字符串名称)
{
如果(!\u酒精分配器。移除锁销(名称))
返回false;
_非酒精性消炎药。移除鸡尾酒(名称);
返回true;
}
公共鸡尾酒会(个人,字符串cocktailName)
{
如果(人年龄<18岁)
return _nonAlcoholicDispenser.Dispence(cocktailName);
其他的
返回-酒精配药器分配(cocktailName);
}
}
公共类分配器
{
私人只读词典_cocktails=新词典();
公共鸡尾酒会(鸡尾酒会)
{
_鸡尾酒。添加(鸡尾酒。名称,鸡尾酒);
}
public bool RemoveCocktail(字符串cocktailName)
{
返回鸡尾酒。移除(鸡尾酒名称);
}
公共鸡尾酒会(字符串cocktailName)
{
return_cocktails[鸡尾酒名称];
}
}
公务舱鸡尾酒
{
公共字符串名称{get;set;}
公共布尔值{get;set;}
公共鸡尾酒配方{get;set;}
公共鸡尾酒(串名、酒精饮料、鸡尾酒配方)
{
名称=名称;
酒精=酒精;
配方=配方;
}
公共重写字符串ToString()
{
string res=“Name:”+Name+”(“+(酒精性?:“非酒精性”)+”);
返回res;
}
}
公营鸡尾酒配方
{
公共列表成分{get;set;}
}
公共类成分
{
公共字符串名称{get;set;}
公共双卷{get;set;}
公共成分(字符串名称,双卷)
{
名称=名称;
体积=体积;
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共整数{get;set;}
公众人物(字符串名称,整数年龄)
{
名称=名称;
年龄=年龄;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var kiosk=新kiosk();
kiosk.add鸡尾酒(“莫吉托”,新鸡尾酒配方(),新鸡尾酒配方());
var majorPerson=新人(“汤姆”,20岁);
var minorPerson=新人(“吉米”,17岁);
控制台。WriteLine(kiosk.Get鸡尾酒(majorPerson,“Mojito”);
Console.WriteLine(kiosk.GetCocktail(米诺佩森,Mojito));
Console.ReadKey();
}
}

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

我不会给你答案,但我会在这里提供细节

  • 在您的信息亭项目中,您需要创建两个私有
    分发器
    对象(这是您的摘要
    创建者
  • 创建一个
    AlchoholicDispenser
    作为具体的
    Creator
    和一个
    NonAlchoholicDispenser
    作为您的其他具体的
    创建者。稍后,您还可以创建
    巧克力分发器
    和其他许多工具
  • 在您的信息亭内,创建一个
    if/else
    子句,并根据请求者选择您选择的
    dispender
    对象
  • 稍后,您可能需要创建一个
    字典
    创建如下服务函数:
    kiosk.service(ItemType.NonAlchoholic)

    代码看起来像

    public Beverage Serve(ItemType type) {
        dispenserDict[type].CreateItem();
    }
    

    您可以尝试一种
    Factory
    模式,可能带有一个
    CocktailDispenderFactory
    ,它以年龄为参数……它将返回一个
    ICocktailDispenser
    ,工厂将根据年龄对其进行适当的实例化。您将有两个
    ICocktailDispenser
    的实现,酒精和非酒精。不管是哪种方式,祝你作业顺利,在2周内不要太紧张。可以使用多种设计模式,但这取决于你处理问题的方式。如果一个步骤在某个阶段改变了行为,那么它就是策略模式,如果在创建时改变了对象,那么它就是工厂模式。所以这取决于你的approach@SimonWilson工厂模式的问题是每次我想要一杯鸡尾酒时都要制造一个新的分配器,在我看来这不是一个很好的方式。此外,我还需要有一个地方,可以存放鸡尾酒“食谱”,可以添加或删除。@Hoshani为什么我不喜欢这里的策略,因为每个人都想要