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);
}
我认为“曾经”这个词应该是“每一个”。如果我错了,请原谅我