>source

이 질문을 게시하고 싶지 않았지만 이미 며칠 동안 아이디어가 없습니다. 내 대학에서는 디자인 패턴을 사용하여 일부 작업을 "해결"하는 작업을 받았습니다.

여기에 내가 붙어있는 작업이 있습니다 (번역).

The kiosk has 2 vending machines with cocktails. One contains several alcoholic cocktails, the other one - their non-alcoholic alternatives. Depending on the age of buyer dispense alcoholic or non-alcoholic cocktail.

이미 두 가지 솔루션을 만들었지 만 그중 어느 것도 디자인 패턴이 없습니다. 나는 창조 패턴에 대해 생각하고 있었지만 그 사용 사례에서 나는 그것이 좋은 선택이라고 생각하지 않습니다. 또한 전략, 중재자, 책임 사슬, 파사드 및 브리지에 대해 생각했지만 제 생각에는 여기에도 적합하지 않습니다.

또한 추가 문제는 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

    나는 사용을 제안합니다 Factory Method 무늬. GoF에는 Factory 패턴이없고 Factory Method와 Abstract Factory 패턴 만 있다는 것을 명심하십시오.

    해결책은 제공하지 않겠지 만 여기에서 세부 정보를 제공하겠습니다.

    키오스크 항목에서 두 개를 만들어야합니다.은밀한 Dispenser 개체 (이것은 귀하의 추상 Creator )

    만들기 AlchoholicDispenser 콘크리트로 Creator 그리고 NonAlchoholicDispenser 다른 콘크리트로 Creator . 나중에 만들 수도 있습니다. ChocolateDispenser 그리고 많은 다른 사람들.

    키오스크 안에 if/else 절, 요청자에 따라 Dispenser 당신이 선택한 물건.

    나중에 생성 할 수 있습니다. Dictionary<ItemType, Dispenser> 다음과 같이 serve 함수를 생성합니다. kiosk.Serve(ItemType.NonAlchoholic)

    코드는 다음과 같습니다.

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

관련 자료

  • 이전 sql - oracle 오류 ora-02270 - 이 열 목록에 일치하는 고유 또는 기본 키가 없습니다
  • 다음 html - 부트 스트랩 - 모바일보기에서 버튼을 텍스트 상자와 같은 너비로 만드는 방법은 무엇입니까?