private static void Main(string[] args) { #region OpenClosePrinicple var apple = new OpenClosedPrinciple.Product("Apple", OpenClosedPrinciple.Color.Green, OpenClosedPrinciple.Size.Small); var tree = new OpenClosedPrinciple.Product("Tree", OpenClosedPrinciple.Color.Green, OpenClosedPrinciple.Size.Large); var house = new OpenClosedPrinciple.Product("House", OpenClosedPrinciple.Color.Blue, OpenClosedPrinciple.Size.Large); var products = new List <OpenClosedPrinciple.Product>() { apple, tree, house }; var fp = new OpenClosedPrinciple.FilterProducts(); Console.WriteLine("Green products:"); var gp = fp.Filter(products, new OpenClosedPrinciple.Specification(OpenClosedPrinciple.Size.Large)); foreach (var p in gp) { Console.WriteLine($" - {p.Name} is Large"); } var fps = new OpenClosedPrinciple.FilterProducts(); Console.WriteLine("Green products an large:"); var lp = new List <OpenClosedPrinciple.ISpecification <OpenClosedPrinciple.Product> > { new OpenClosedPrinciple.Specification(OpenClosedPrinciple.Size.Large), new OpenClosedPrinciple.Specification(OpenClosedPrinciple.Color.Green) }; var gps = fp.Filters(products, lp); foreach (var p in gps) { Console.WriteLine($" - {p.Name} is green and large"); } #endregion }
// Open-Closed Principle Example public static void OCP() { var apple = new OpenClosedPrinciple.Product("Apple", OpenClosedPrinciple.Color.Green, OpenClosedPrinciple.Size.Small); var tree = new OpenClosedPrinciple.Product("Tree", OpenClosedPrinciple.Color.Green, OpenClosedPrinciple.Size.Large); var house = new OpenClosedPrinciple.Product("House", OpenClosedPrinciple.Color.Blue, OpenClosedPrinciple.Size.Large); OpenClosedPrinciple.Product[] products = { apple, tree, house }; var pf = new OpenClosedPrinciple.ProductFilter(); WriteLine("Green products (old): "); foreach (var p in pf.FilterByColor(products, OpenClosedPrinciple.Color.Green)) { WriteLine($" - {p.Name} is green"); } // ^^ BEFORE // vv AFTER var bf = new OpenClosedPrinciple.BetterFilter(); WriteLine("Green products (new): "); foreach (var p in bf.Filter(products, new OpenClosedPrinciple.ColorSpecification(OpenClosedPrinciple.Color.Green))) { WriteLine($" - {p.Name} is green"); } WriteLine("Large blue items: "); foreach (var p in bf.Filter( products, new OpenClosedPrinciple.AndSpecification <OpenClosedPrinciple.Product>( new OpenClosedPrinciple.ColorSpecification(OpenClosedPrinciple.Color.Blue), new OpenClosedPrinciple.SizeSpecification(OpenClosedPrinciple.Size.Large) ))) { WriteLine($" - {p.Name} is big and blue"); } }