Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于用户输入使用decorator设计原则创建类实例_Java_Design Patterns_User Input - Fatal编程技术网

Java 基于用户输入使用decorator设计原则创建类实例

Java 基于用户输入使用decorator设计原则创建类实例,java,design-patterns,user-input,Java,Design Patterns,User Input,目前,我有如下可执行代码: Sandwich sandwich_wTuna_wDoubleCheese = new Cheese(new Cheese(new Tuna(new Bread()))); List<String> list=new ArrayList<String>(); list.add("Cheese"); list.add("Cheese"); list.add("Tuna"); Sandw

目前,我有如下可执行代码:

Sandwich sandwich_wTuna_wDoubleCheese = new Cheese(new Cheese(new Tuna(new Bread())));
List<String> list=new ArrayList<String>();
list.add("Cheese");
list.add("Cheese");
list.add("Tuna");
Sandwich sandwich_wTuna_wDoubleCheese = bakery1.SellBreads(list);
public interface IIngredient{}
public abstract class BaseIngredient : IIngredient
{
    private readonly IIngredient _inside;
    protected BaseIngredient(IIngredient inside)
    {
        _inside = inside;
    }
}

public class Tuna : BaseIngredient
{
    public Tuna(IIngredient inside) : base(inside)
    {
    }
}
public class Cheese : BaseIngredient
{
    public Cheese(IIngredient inside) : base(inside)
    {
    }
}
public class Bread : BaseIngredient
{
    public Bread(IIngredient inside) : base(inside)
    {
    }
}


public class IngredientFactory
{
    private readonly Dictionary<string, Func<IIngredient, IIngredient>> _ctors;

    public IngredientFactory()
    {
        _ctors = new Dictionary<string, Func<IIngredient, IIngredient>>()
        {
            {"tuna", (i) => new Tuna(i)},
            {"cheese", (i) => new Cheese(i)},
            {"bread", (i) => new Bread(i)},
        };
    }

    public IIngredient Create(string name, IIngredient inside)
    {
        if(!_ctors.ContainsKey(name))
            throw new ArgumentOutOfRangeException(nameof(name), "invalid ingredient");
        return _ctors[name](inside);
    }
}
List<String> list = new List<String>();
list.Add("Cheese");
list.Add("Cheese");
list.Add("Tuna");

IIngredient result = null;

var factory = new IngredientFactory();
foreach (var name in list)
{
    result = factory.Create(name, result);
}
为了更好地理解,Sandwich是一个抽象类,由Bread和SandwichDecorator扩展。三明治装潢师本人也是抽象的,并通过奶酪、金枪鱼、西红柿等来扩展,。。你说吧

现在这很好,但是我有一些面包店应该出售这些三明治,这些三明治是用装饰设计原理制作的。 我该怎么做

我希望我能做这样的事情:

Sandwich sandwich_wTuna_wDoubleCheese = new Cheese(new Cheese(new Tuna(new Bread())));
List<String> list=new ArrayList<String>();
list.add("Cheese");
list.add("Cheese");
list.add("Tuna");
Sandwich sandwich_wTuna_wDoubleCheese = bakery1.SellBreads(list);
public interface IIngredient{}
public abstract class BaseIngredient : IIngredient
{
    private readonly IIngredient _inside;
    protected BaseIngredient(IIngredient inside)
    {
        _inside = inside;
    }
}

public class Tuna : BaseIngredient
{
    public Tuna(IIngredient inside) : base(inside)
    {
    }
}
public class Cheese : BaseIngredient
{
    public Cheese(IIngredient inside) : base(inside)
    {
    }
}
public class Bread : BaseIngredient
{
    public Bread(IIngredient inside) : base(inside)
    {
    }
}


public class IngredientFactory
{
    private readonly Dictionary<string, Func<IIngredient, IIngredient>> _ctors;

    public IngredientFactory()
    {
        _ctors = new Dictionary<string, Func<IIngredient, IIngredient>>()
        {
            {"tuna", (i) => new Tuna(i)},
            {"cheese", (i) => new Cheese(i)},
            {"bread", (i) => new Bread(i)},
        };
    }

    public IIngredient Create(string name, IIngredient inside)
    {
        if(!_ctors.ContainsKey(name))
            throw new ArgumentOutOfRangeException(nameof(name), "invalid ingredient");
        return _ctors[name](inside);
    }
}
List<String> list = new List<String>();
list.Add("Cheese");
list.Add("Cheese");
list.Add("Tuna");

IIngredient result = null;

var factory = new IngredientFactory();
foreach (var name in list)
{
    result = factory.Create(name, result);
}
List List=new ArrayList();
列表。添加(“奶酪”);
列表。添加(“奶酪”);
添加(“金枪鱼”);
三明治三明治双奶酪=面包1.出售面包(列表);
当然,我可以通过实例,在面包店功能中进行装饰,但我希望还有其他方法


你有没有办法,如何解决这个问题?感谢您的帮助和建议。

您可以对
列表中的每个元素使用
字符串上的
开关来创建三明治装饰层

sandwich = switch (choice) {
    case "Cheese" -> new Cheese(sandwich);
    case "Tuna" -> new Tuna(sandwich);
    default -> throw UnknownSandwichChoice(choice);
};

您可以通过递归或迭代对
列表中的每个元素执行此操作。

这表明您选择的设计模式与您的问题不匹配

首先找出要对对象执行的操作,然后选择符合这些要求的设计模式

您为包含部分三明治和一个附加层的化合物引入了(不同的)抽象(并给出了这些化合物的误导性名称,仅暗示附加层)

但是对于排序,您需要层本身的抽象,而这在您的模型世界中并不存在


因此,我会忘记您的装饰模式,而是创建一个具有层列表的类,通常(但不一定?)从
面包层开始,然后再创建其他层。然后,可以通过在构造函数中提供层列表,或者在现有三明治上调用add(Layer)方法来完成构造。

这看起来像是工厂的作业:)

试着这样做:

Sandwich sandwich_wTuna_wDoubleCheese = new Cheese(new Cheese(new Tuna(new Bread())));
List<String> list=new ArrayList<String>();
list.add("Cheese");
list.add("Cheese");
list.add("Tuna");
Sandwich sandwich_wTuna_wDoubleCheese = bakery1.SellBreads(list);
public interface IIngredient{}
public abstract class BaseIngredient : IIngredient
{
    private readonly IIngredient _inside;
    protected BaseIngredient(IIngredient inside)
    {
        _inside = inside;
    }
}

public class Tuna : BaseIngredient
{
    public Tuna(IIngredient inside) : base(inside)
    {
    }
}
public class Cheese : BaseIngredient
{
    public Cheese(IIngredient inside) : base(inside)
    {
    }
}
public class Bread : BaseIngredient
{
    public Bread(IIngredient inside) : base(inside)
    {
    }
}


public class IngredientFactory
{
    private readonly Dictionary<string, Func<IIngredient, IIngredient>> _ctors;

    public IngredientFactory()
    {
        _ctors = new Dictionary<string, Func<IIngredient, IIngredient>>()
        {
            {"tuna", (i) => new Tuna(i)},
            {"cheese", (i) => new Cheese(i)},
            {"bread", (i) => new Bread(i)},
        };
    }

    public IIngredient Create(string name, IIngredient inside)
    {
        if(!_ctors.ContainsKey(name))
            throw new ArgumentOutOfRangeException(nameof(name), "invalid ingredient");
        return _ctors[name](inside);
    }
}
List<String> list = new List<String>();
list.Add("Cheese");
list.Add("Cheese");
list.Add("Tuna");

IIngredient result = null;

var factory = new IngredientFactory();
foreach (var name in list)
{
    result = factory.Create(name, result);
}
我认为“曾经”这个词应该是“每一个”。如果我错了,请原谅我