复合代理模式 集合与背后属性

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);
        }
    }

 

posted @ 2022-05-20 17:38  后跳  阅读(21)  评论(0编辑  收藏  举报