zoukankan      html  css  js  c++  java
  • 观察者模式(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
  • 相关阅读:
    12306是如何实现高流量高并发的关键技术
    阿里知名工程师
    侵入式和非侵入式的区别
    二叉树节点的最大距离
    2014阿里面经(转)
    jq checkbox的相关操作——全选、反选、获得所有选中的checkbox
    表现和数据分离的好处
    css3完成多边形
    程序员,如何从平庸走向理想?--转载
    js对象和字符串相互转换
  • 原文地址:https://www.cnblogs.com/suzixuan/p/6995608.html
Copyright © 2011-2022 走看看