简单的观察者模式示例分享

时间:2023-02-11 12:52:12 


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.WriteLine();
            Console.ReadKey();
        }
    }
}

标签:c#,观察者模式
0
投稿

猜你喜欢

  • Android使用GPS获取用户地理位置并监听位置变化的方法

    2022-03-29 14:24:17
  • java(包括springboot)读取resources下文件方式实现

    2021-06-03 20:16:06
  • 浅析C#中的Main(String[] args)参数输入问题

    2023-08-13 01:45:58
  • 详解Android如何实现阴影效果

    2022-04-14 13:11:16
  • Android根据电话号码获得联系人头像实例代码

    2022-01-07 04:08:10
  • 一文带你了解Java万物之基之Object类

    2023-10-09 01:58:28
  • java中的FileInputStream三种read()函数用法

    2021-10-27 23:01:21
  • AndroidStudio修改Code Style来格式化自定义标签的xml文件方式

    2023-08-07 00:43:21
  • Java实现简单QQ聊天工具

    2023-11-25 05:54:52
  • Android 媒体开发之MediaPlayer状态机接口方法实例解析

    2023-04-20 06:53:22
  • Java使用设计模式中的工厂方法模式实例解析

    2021-12-07 03:57:49
  • C#实现创建,删除,查找,配置虚拟目录实例详解

    2022-09-27 06:38:16
  • Spring集成jedis的配置与使用简单实例

    2023-07-02 04:11:39
  • Android消息机制Handler的工作过程详解

    2023-07-31 13:49:03
  • spring boot配置多个请求服务代理的完整步骤

    2023-03-30 10:30:49
  • Java Timer使用讲解

    2023-11-28 20:30:33
  • C#简单输出日历的方法

    2023-11-13 05:56:10
  • C#将制定目录文件名转换成大写的方法

    2022-10-03 19:46:36
  • Java序列化和反序列化示例介绍

    2023-11-25 04:24:26
  • java Spring Boot 配置redis pom文件操作

    2022-01-25 20:57:13
  • asp之家 软件编程 m.aspxhome.com