using System.Collections.Generic;
public PlantItem(string itemName, double itemPrice)
public class BouquetItem : PlantItem
get{return price * _pieces;}
public BouquetItem(PlantItem item):base(item.name, item.price)
public void piecesInAmount(double amount)
_pieces = (int)Math.Floor(amount/price);
public override String ToString()
return String.Format("{0,15} x{1,2} = {2,4}", name, _pieces, Total);
private List<BouquetItem> _items;
return _items.Sum(o => o.Total);
_items = new List<BouquetItem>();
public void addItem(BouquetItem item)
public override String ToString()
StringBuilder sb = new StringBuilder();
sb.Append(Environment.NewLine);
sb.Append(String.Format("{0,19} = {1,4}", "Solution cost", Cost));
sb.Append(Environment.NewLine);
sb.Append("===========================");
sb.Append(Environment.NewLine);
public interface IBuilderStrategy
List<PlantItem> prepareItems(List<PlantItem> items);
public class BuilderStrategyExpensiveFirst: IBuilderStrategy
public List<PlantItem> prepareItems(List<PlantItem> items){
return items.OrderByDescending(o=>o.price).ToList();
public class BuilderStrategyCheaperFirst: IBuilderStrategy
public List<PlantItem> prepareItems(List<PlantItem> items){
return items.OrderBy(o=>o.price).ToList();
public interface IBouquetBuilder
Bouquet build(double amount, List<PlantItem> items);
class BouquetBuilder: IBouquetBuilder
public Bouquet build(double amount, List<PlantItem> items){
Bouquet solution = new Bouquet();
Random rnd = new Random();
item = new BouquetItem(items[items.Count - id]);
shares *= (40 + Math.Floor(rnd.Next(8)*5.0))/100;
item.piecesInAmount(shares);
public class BouquetManager
private List<PlantItem> _items;
public List<PlantItem> Items{
private Bouquet _solution;
public Bouquet Solution {
private IBuilderStrategy _strategy;
public IBuilderStrategy Strategy{
private IBouquetBuilder _builder;
public IBouquetBuilder Builder{
public void build(double amount){
_solution = _builder.build(amount, _strategy!=null?_strategy.prepareItems(_items):_items);
public static void Main()
List<PlantItem> items = new List<PlantItem>(){
new PlantItem("Рози", 1.2),
new PlantItem("Хризантеми", 0.4),
new PlantItem("Гладиоли", 0.8)
BouquetManager manager = new BouquetManager();
manager.Strategy = new BuilderStrategyExpensiveFirst();
manager.Builder = new BouquetBuilder();
Console.Write(manager.Solution);
Console.Write(manager.Solution);
manager.Strategy = new BuilderStrategyCheaperFirst();
Console.Write(manager.Solution);
manager.Strategy = new BuilderStrategyExpensiveFirst();
items.Add(new PlantItem("Лале", 2.3));
Console.Write(manager.Solution);
Console.Write(manager.Solution);
Console.Write(manager.Solution);
Console.Write(manager.Solution);