using System;
using System.Collections.Generic; namespace Demo
{
    #region 抽象层,定义了观察者模式
    /// <summary>
    /// (抽象)新闻
    /// </summary>
    public interface INews
    {
        void SubScribe(ISubscriber s);
        void UnSubScribe(ISubscriber s);
        void Publish(string newsTitle);   //在具体实现的过程中建立发布与订阅的联系
    }     /// <summary>
    /// (抽象)订阅者
    /// </summary>
    public interface ISubscriber
    {
        void Read(string newsTitle);
    }
    #endregion     #region 实现层,是对抽象层的具体实现
    /// <summary>
    /// (具体)新闻
    /// </summary>
    public class ITNews : INews
    {
        private List<ISubscriber> readers = new List<ISubscriber>();         public void SubScribe(ISubscriber s)
        {
            readers.Add(s);
        }         public void UnSubScribe(ISubscriber s)
        {
            if (readers.Count >0)
            {
                readers.Remove(s);
            }
        }         public void Publish(string newsTitle)
        {
            foreach (ISubscriber i in readers)
            {
                i.Read(newsTitle);          //<<<<<发布的时候订阅>>>>>
            }
        }
    }     /// <summary>
    /// (具体)订阅者
    /// </summary>
    public class Subscriber : ISubscriber
    {
        private string subscriber = string.Empty;
        public Subscriber(string subscriber)
        {
            this.subscriber = subscriber;
        }         public void Read(string newsTitle)
        {
            Console.WriteLine(string.Format("{0}阅读了IT新闻\"{1}\"", subscriber, newsTitle));
        }
    }
    #endregion     public class Pro
    {
        static void Main(string[] args)
        {
            ITNews news = new ITNews();
            Subscriber zs = new Subscriber("张三"),
                                 ls = new Subscriber("李四"),
                                 ww = new Subscriber("王五");             news.SubScribe(zs);
            news.SubScribe(ls);
            news.SubScribe(ww);
            news.UnSubScribe(ls);  //张三取消订阅             news.Publish("2014年移动电商攻坚战:阿里巴巴如何破局?");
            news.Publish("余额宝还能重回高收益率吗?");             Console.ReadKey();
        }
    }
}

观察者模式Demo的更多相关文章

  1. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  2. java设计模式--事件监听器模式和观察者模式

    监听器模式:事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到事件对象可以回调事件的方法 观察者模式:观察者(Observer)相当于事件监听者,被观察者(Observable)相当于事 ...

  3. Android观察者模式的简单实现demo

    观察者模式就是:当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新. 下面介绍一种简单的使用方法,(下面有demo链接)先看一下project的目录构成: ObserverList ...

  4. Android设计模式---观察者模式小demo(一)

    1,今天刚好看到了设计模式这一块来,而观察者模式是我一直想总结的,先来看看观察者模式的简单的定义吧 "当一个对象改变时,他的所有依赖者都会受到通知,并自动更新." 一般我们项目中就 ...

  5. MVVM与Backbone demo

    MVVM https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel

  6. 浅谈Java五大设计原则之观察者模式

    定义一下观察者模式: 观察者模式又叫  发布-订阅  模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象 将得到通知并自动更新(摘自Hand First). ...

  7. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  8. 浅谈Adapter中观察者模式

    首先让我们看一个客户端图片 这是京东客户端的购物车界面.有这么一种功能,当我们在商品列表中调整商品数量等信息的时候,下方的金额总数也随之变化. 可以看出,这个界面有一个数据源,一个适配器,一个List ...

  9. iOS中常见的设计模式——单例模式\委托模式\观察者模式\MVC模式

    一.单例模式 1. 什么是单例模式? 在iOS应用的生命周期中,某个类只有一个实例. 2. 单例模式解决了什么问题? 想象一下,如果我们要读取文件配置信息,那么每次要读取,我们就要创建一个文件实例,然 ...

随机推荐

  1. Webform——购物车

    购物车主要实现的功能: ①在主页面可以将所有商品显示出来,包括价格,库存. ②点击购买可以累加产品,如果是同一种产品,只会累加每种产品的数量. ③查看购物车,可以查看明细,包括所购物品的名称,价格,数 ...

  2. android Service Activity三种交互方式(付源码)

    android SDK提供了Service,用于类似Linix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service):用于应用程序内部 远程服务(Rem ...

  3. linux tar 解压命令总结

    把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其 ...

  4. VS.NET2010水晶报表安装部署

    水晶报表VS2010版IDE安装标准版SAP Crystal Reports, version for Visual Studio 2010 - Standard: 下载地址: http://down ...

  5. HDU 4195 Regular Convex Polygon

    思路:三角形的圆心角可以整除(2*pi)/n #include<cstdio> #include<cstring> #include<iostream> #incl ...

  6. jQuery技术内幕电子版5

    4. 转换HTML代码为DOM元素 先创建一个文档片段DocumentFragment,然后调用方法jQuery.clean(elems, context, frag-ment, scripts)将H ...

  7. Storm系列(六)架构分析之Scheduler-调度器[EventScheduler]

    任务调度接口定义: 1  IScheduler{ 2      // conf为当前nimbus的stormp配置 3  void prepare(Map conf); // 初始化 4  // to ...

  8. HW4.3

    public class Solution { public static void main(String[] args) { final double POUND_PER_KILOGRAM = 2 ...

  9. A list of base boxes for Vagrant - Vagrantbox.es

    Create image server with nginx + lua (Openresty) + graphicsmagick (Part I) | Ian's PhotograPhy Blog ...

  10. PC-信使服务之不用聊天软件也能通信

    net send 192.168.1.2 OK 二台电脑都要开启messenger服务.