我真的不想发布这个问题,但我已经有几天没有想法了。在我的大学里,我被赋予了使用设计模式来“解决”一些任务的任务。
这是我坚持的任务(翻译):
<块引用>售货亭有 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();
}
}
答案 0 :(得分:1)
我建议使用 Factory Method
模式。请记住,在 GoF 中没有工厂模式,只有工厂方法和抽象工厂模式。
我不会给你解决方案,但我会在这里提供细节。
Dispenser
对象(这是您的抽象 Creator
)AlchoholicDispenser
创建为具体的 Creator
,将 NonAlchoholicDispenser
创建为其他具体的 Creator
。稍后,您还可以创建 ChocolateDispenser
和许多其他内容。if/else
子句,并根据请求者选择您选择的 Dispenser
对象。稍后,您可能希望创建一个 Dictionary<ItemType, Dispenser>
创建服务函数:kiosk.Serve(ItemType.NonAlchoholic)
代码看起来像
public Beverage Serve(ItemType type) {
dispenserDict[type].CreateItem();
}