(精华)2020年8月14日 C#基础知识点 23种设计模式(行为型模式---观察者模式)

public class Program
    {
        public static void Show()
        {
            {
                //普通
                Cat cat = new Cat();
                cat.AddObserver(new Chicken());
                cat.AddObserver(new Baby());
                cat.MiaoObserver();
            }
            {
                //委托(action,无返回值)
                Cat cat = new Cat();
                cat.MiaoHandler += (new Chicken().Woo);
                cat.MiaoHandler += (new Baby().Cry);
                cat.MiaoEvent();
            }
            {
                //委托(fun,有返回值)
                Cat cat = new Cat();
                cat.MiaoHandlerReturn += (new Chicken().Woo);
                cat.MiaoHandlerReturn += (new Baby().Cry);
                cat.MiaoEventReturn();
            }
        }
    }
/// 
    /// 只是为了把多个对象产生关系,方便保存和调用
    /// 方法本身其实没用
    /// 
    public interface IObserver
    {
        void Action();
    }
    public class Chicken : IObserver
    {
        public void Action()
        {
            this.Woo();
        }
        public void Woo()
        {
            Console.WriteLine("{0} Woo", this.GetType().Name);
        }
    }
    public class Baby : IObserver
    {
        public void Action()
        {
            this.Cry();
        }

        public void Cry()
        {
            Console.WriteLine("{0} Cry", this.GetType().Name);
        }
    }
public class Cat
    {
        //但是出现了很多依赖---不稳定---这个符合实际情况吗?老鼠的变化跟猫有啥关系?--不科学,代码有坏的味道---怎么解决?
        //职责分析:其他动作不是猫的事儿---但是因为业务需求,才放在一起
        //想办法转移一下,其他动作-------封装转移
        private List<IObserver> observerList = new List<IObserver>();
        /// 
        /// 只能上端添加--甩锅给了上端
        /// 
        /// 
        public void AddObserver(IObserver observer)
        {
            this.observerList.Add(observer);
        }
        public void MiaoObserver()
        {
            Console.WriteLine("{0} MiaoObserver.....", this.GetType().Name);
            foreach (var observer in observerList)
            {
                observer.Action();
            }
        }
        //有知道这个段子 都TMD赖丘处机当年路过了牛家村! 否则中国将是世界上最发达的国家
        //甩锅:有什么责任,都推到别人头上,哪管他洪水滔天---职场人士有时候得学那么点~
        //C#观察者模式的优雅实现
        public event Action MiaoHandler;
        public void MiaoEvent()
        {
            Console.WriteLine("{0} MiaoEvent.....", this.GetType().Name);
            foreach (Action observer in this.MiaoHandler?.GetInvocationList())
            {
                observer.Invoke();
            }
        }

        /// 
        /// 被观察者/主题  观察者有多少 不知道  观察者之间  和被观察者之间  松耦合
        /// 
        public event Func<int> MiaoHandlerReturn;
        public int MiaoEventReturn()
        {
            Console.WriteLine("{0} MiaoHandlerReturn.....", this.GetType().Name);
            foreach (Func<int> observer in this.MiaoHandlerReturn?.GetInvocationList())
            {
                try
                {
                    int iResult = observer.Invoke();
                }
                catch (Exception)
                {
                }
            }
            return 1;
        }
    }

你可能感兴趣的:(C#,c#)