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 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
List<BouquetItem> build(double amount, List<PlantItem> items);
class BouquetBuilder: IBouquetBuilder
public List<BouquetItem> build(double amount, List<PlantItem> items){
List<BouquetItem> solution = new List<BouquetItem>();
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 List<BouquetItem> _solution;
public List<BouquetItem> 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);
static void printSolution(List<BouquetItem> solution)
foreach(BouquetItem item in solution)
Console.WriteLine(item.name+" x"+item.pieces);
cost += item.price * item.pieces;
Console.WriteLine("Solution cost: " + cost);
Console.WriteLine("=======================");
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();
printSolution(manager.Solution);
printSolution(manager.Solution);
manager.Strategy = new BuilderStrategyCheaperFirst();
printSolution(manager.Solution);