c#面向对象23种设计模式——"观察者模式"

一、概述

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当主题(被观察者)对象的状态发生变化时,其所有依赖(观察者)对象都会自动进行更新。

二、简介

观察者模式的原理包括以下几个要素:

  1. 主题(ISubject):主题对象负责管理观察者对象的注册、删除和通知操作。它维护一个观察者列表,并提供了用于添加、删除和通知观察者的方法。
  2. 观察者(IObserver):观察者对象对主题对象的状态变化进行观察,并作出相应的反应。观察者对象通常定义了一个接口或抽象类,其中包含了接收更新通知的方法。
  3. 具体主题(NewsPublisher):具体主题对象是主题的具体实现,它维护了一个当前状态,并在状态发生变化时通知所有注册的观察者对象。
  4. 具体观察者(Users):具体观察者对象是观察者的具体实现,它实现了接收更新通知的方法,并定义了在接收到通知时具体进行的操作。

具体实现观察者模式时,通常的做法是在主题对象中维护一个观察者列表,并提供方法用于添加、删除和通知观察者。当主题对象的状态发生变化时,它会遍历观察者列表,调用每个观察者对象的更新方法。观察者对象则根据接收到的更新信息进行相应的处理操作。

观察者模式的原理可以帮助实现松耦合的对象间通信,使得对象之间的依赖关系变得灵活可扩展。同时,观察者模式也可以支持多个观察者对象对同一主题进行观察,使得对象之间的关系更加松散,提高系统的可维护性和扩展性。

三、代码实现演示

1、新闻对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    /// <summary>
    /// 新闻
    /// </summary>
    public class News
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 内容
        /// </summary>
        public string Context { get; set; }
    }
}

2、主题接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    /// <summary>
    /// 主题
    /// </summary>
    public interface ISubject
    {
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="observer">观察者的行为</param>
        public void Regist(IObserver observer);
        /// <summary>
        /// 注销
        /// </summary>
        /// <param name="observer">观察者的行为</param>
        public void LogOut(IObserver observer);
        /// <summary>
        /// 通知
        /// </summary>
        /// <param name="news">新闻信息</param>
        public void Inform(News news);
    }
}

3、主题具体实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    /// <summary>
    /// 主题实现
    /// 继承主题接口
    /// </summary>
    public class NewsPublisher : ISubject
    {
        /// <summary>
        /// 继承了观察者操作的用户列表
        /// </summary>
        private List<IObserver> Observers = new List<IObserver>();

        /// <summary>
        /// 注销接口实现
        /// 删除观察者的行为
        /// </summary>
        /// <param name="observer">用户</param>
        public void LogOut(IObserver observer)
        {
            Observers.Remove(observer);
            Console.WriteLine("注销");
            Console.WriteLine();
        }

        /// <summary>
        /// 注册接口实现
        /// 添加观察者的行为
        /// </summary>
        /// <param name="observer">用户</param>
        public void Regist(IObserver observer)
        {
            Observers.Add(observer);
            Console.WriteLine("注册");
            Console.WriteLine();
        }

        /// <summary>
        /// 通知接口实现
        /// 遍历所有用户通知行为
        /// </summary>
        /// <param name="news">新闻信息</param>
        public void Inform(News news)
        {
            foreach (IObserver observer in Observers)
            {
                observer.Observer(news);
            }
            Console.WriteLine("通知");
            Console.WriteLine();
        }
    }
}

4、观察者行为接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    /// <summary>
    /// 观察者行为接口
    /// </summary>
    public interface IObserver
    {
        /// <summary>
        /// 行为操作
        /// </summary>
        /// <param name="news">新闻信息</param>
        public void Observer(News news);
    }
}

5、观察者具体实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    /// <summary>
    /// 观察者,继承观察者的行为
    /// </summary>
    public class Users : IObserver
    {
        /// <summary>
        /// 实现行为
        /// </summary>
        /// <param name="news"></param>
        public void Observer(News news)
        {
            Console.WriteLine($"订阅新闻=> 标题:{news.Title},描述:{news.Context}");
        }
    }
}

四、效果演示

1、代码调用

  static void Main(string[] args)
  {
      //定义一个主题
      NewsPublisher newsPublisher = new NewsPublisher();

      //定义一个用户
      Users users = new Users();

      //把用户通过注册接口添加到主题中的用户列表
      newsPublisher.Regist(users);

      //定义一个新闻
      News news = new News()
      {
          Title = "新闻",
          Context = "新闻描述"
      };
      //把新闻通过通知的接口 告诉用户,让用户实现用户行为
      newsPublisher.Inform(news);

      //把用户通过注销接口删除主题中的用户列表中的用户
      newsPublisher.LogOut(users);


      newsPublisher.Inform(news);
  }

2、结果

image.png

以上就是我了解到行为型设计模式中的————"观察者模式"的简单示例,大家有更好的见解,欢迎到评论区讨论!!!

全部评论

相关推荐

找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务