• 观察者模式(Publish/Subscribe)


    观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

    当一个对象的改变需要同时改变其他对象的时候,而且他不知道具体有多少对象有待改变,应该考虑使用观察者模式。

    观察者模式所做的工作其实就是解除耦合,让耦合双发都依赖于抽象,而不是依赖于具体。

    // 订阅号抽象类
        public abstract class Blog
        {
            // 保存订阅者列表
            private List<IObserver> observers = new List<IObserver>();
    
            public string Symbol { get; set; }//描写订阅号的相关信息
            public string Info { get; set; }//描写此次update的信息
            public Blog(string symbol, string info)
            {
                this.Symbol = symbol;
                this.Info = info;
            }
    
            // 对同一个订阅号,新增和删除订阅者的操作
            public void AddObserver(IObserver ob)
            {
                observers.Add(ob);
            }
            public void RemoveObserver(IObserver ob)
            {
                observers.Remove(ob);
            }
    
            public void Update()
            {
                // 遍历订阅者列表进行通知
                foreach (IObserver ob in observers)
                {
                    if (ob != null)
                    {
                        ob.Receive(this);
                    }
                }
            }
        }
    
        // 具体订阅号类
        public class MyBlog : Blog
        {
            public MyBlog(string symbol, string info)
                : base(symbol, info)
            {
            }
        }
    
        // 订阅者接口
        public interface IObserver
        {
            void Receive(Blog tenxun);
        }
    
        // 具体的订阅者类
        public class Subscriber : IObserver
        {
            public string Name { get; set; }
            public Subscriber(string name)
            {
                this.Name = name;
            }
    
            public void Receive(Blog xmfdsh)
            {
                Console.WriteLine("订阅者 {0} 观察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
            }
        }
    
        // 客户端测试
        class Program
        {
            static void Main(string[] args)
            {
                Blog xmfdsh = new MyBlog("xmfdsh", "发布了一篇新博客");
    
                // 添加订阅者
                xmfdsh.AddObserver(new Subscriber("王尼玛"));
                xmfdsh.AddObserver(new Subscriber("唐马儒"));
                xmfdsh.AddObserver(new Subscriber("王蜜桃"));
                xmfdsh.AddObserver(new Subscriber("敖尼玛"));
    
                //更新信息
                xmfdsh.Update();
                //输出结果,此时所有的订阅者都已经得到博客的新消息
                Console.ReadLine();
            }
        }


    http://www.cnblogs.com/xmfdsh/p/4047114.html
  • 相关阅读:
    NIOS II常用函数整理
    C指针
    YCbCrYUV
    指针与引用的区别
    Pacman 命令详解
    DDR工作原理
    关于C/C++中的点操作符和箭头操作符
    千兆以太网芯片88E1111 RGMII模式的驱动
    关于建立时间和保持时间
    ECE 576 UDP Hardware
  • 原文地址:https://www.cnblogs.com/suzixuan/p/6995608.html
Copyright © 2020-2023  润新知