复合代理模式 集合与背后属性
Compositite_Proxy_Array_Backed_Properties
情景:
有四个点选框 主项是All 子项是Pillars, Walls, Floors;
若子项全选中则主项选中,子项有一项未选中,则主项也未选中。
图例如下(红色为选中):
实现1:
public class MasonrySetting { public bool? All { get { if (Pillars == Walls && Walls == Floors) return Pillars; return null; } set { if (!value.HasValue) return; Pillars = value.Value; Walls = value.Value; Floors = value.Value; } } public bool Pillars, Walls, Floors; } class Program { static void Main(string[] args) { MasonrySetting masonry = new MasonrySetting(); masonry.All = true; masonry.Floors = false; Console.WriteLine("ALL:"+ masonry.All); Console.WriteLine("Pillars:" + masonry.Pillars); Console.WriteLine("Walls:" + masonry.Walls); Console.WriteLine("Floors:" + masonry.Floors); } }
实现2:
public class MasonrySetting { //public bool? All //{ // get // { // if (Pillars == Walls && Walls == Floors) // return Pillars; // return null; // } // set // { // if (!value.HasValue) return; // Pillars = value.Value; // Walls = value.Value; // Floors = value.Value; // } //} // public bool Pillars, Walls, Floors; public bool? All { get { if (flags.Skip(1).All(f => f == flags[0])) return flags[0]; return null; } set { if (!value.HasValue) return; flags[0] = flags[1] = flags[2] = value.Value; } } private bool[] flags = new bool[3]; public bool Pillars { get=> flags[0]; set=> flags[0]=value; } public bool Walls { get => flags[1]; set => flags[1] = value; } public bool Floors { get => flags[2]; set => flags[2] = value; } } class Program { static void Main(string[] args) { MasonrySetting masonry = new MasonrySetting(); masonry.All = false; masonry.Floors = true; Console.WriteLine("ALL:"+ masonry.All); Console.WriteLine("Pillars:" + masonry.Pillars); Console.WriteLine("Walls:" + masonry.Walls); Console.WriteLine("Floors:" + masonry.Floors); } }