C#设计模式---观察者模式(Observer Pattern)

一、目的

提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象。

二、定义

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

三、场景

假设多个用户订阅了微信中的汽车之家公众号,当公众号有新车到来的时候,则会通知所有订阅该公众号的用户,下面用观察者模式来模拟这一场景。

四、实现

 1 using System;
 2 using System.Collections.Generic;
 3
 4 namespace DesignMode_Observer
 5 {
 6     public interface IWechatAccountSubject
 7     {
 8         List<IObserver> ObserverList { get; set;}
 9         string SubjectName { get; set; }
10         string Message { get; set; }
11
12         void AddObserver(IObserver ob);
13         void RemoveObserver(IObserver ob);
14         void Notify();
15
16         void AddNewMsg(string pMsg);
17     }
18     public interface IObserver
19     {
20         string ObservertName { get; set; }
21         void ReceiveNewMessgage(IWechatAccountSubject subject);
22     }
23
24     public class Observer : IObserver
25     {
26         public string ObservertName { get; set; }
27         public Observer(string pName)
28         {
29             this.ObservertName = pName;
30         }
31         public void ReceiveNewMessgage(IWechatAccountSubject subject)
32         {
33             Console.ForegroundColor = ConsoleColor.DarkGreen;
34             Console.WriteLine($"{ObservertName} received msg from {subject.SubjectName}:\n{subject.Message}");
35         }
36     }
37     public class WeChatCarAccountSubject:IWechatAccountSubject
38     {
39         public List<IObserver> ObserverList { get; set; }
40         public string SubjectName { get; set; }
41         public string Message { get; set; }
42         public WeChatCarAccountSubject(string pSubjectName, string pMessage)
43         {
44             this.SubjectName = pSubjectName;
45             this.Message = pMessage;
46             ObserverList = new List<IObserver>();
47         }
48         public void AddObserver(IObserver ob)
49         {
50             ObserverList.Add(ob);
51         }
52         public void RemoveObserver(IObserver ob)
53         {
54             ObserverList.Remove(ob);
55         }
56
57         public void Notify()
58         {
59             foreach (var ob in ObserverList)
60             {
61                 if (ob != null)
62                 {
63                     ob.ReceiveNewMessgage(this);
64                 }
65             }
66         }
67
68         public void AddNewMsg(string pMsg)
69         {
70             Message += pMsg;
71         }
72     }
73
74     class Program
75     {
76         static void Main(string[] args)
77         {
78             IObserver ob1 = new Observer("Mary");
79             IObserver ob2 = new Observer("Jack");
80             IWechatAccountSubject sub = new WeChatCarAccountSubject(nameof(WeChatCarAccountSubject), "New car Audi arrived\n");
81             sub.AddObserver(ob1);
82             sub.AddObserver(ob2);
83             sub.Notify();
84
85             sub.AddNewMsg("New car Bmw arrived\n");
86
87             sub.Notify();
88         }
89     }
90 }

运行结果如下:

五、类图

六、描述

从上图可以看出,在观察者模式的结构图有以下角色:

(1)抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类

    或接口实现。

(2)抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。

(3)具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。

(4)具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。

原文地址:https://www.cnblogs.com/3xiaolonglong/p/9609453.html

时间: 2024-10-09 06:26:37

C#设计模式---观察者模式(Observer Pattern)的相关文章

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

设计模式 - 观察者模式(Observer Pattern) 详细说明

观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的全部依赖者都会收到通知并自己主动更新. 用法: 1. 首先新建主题(subject)接口, 负责注冊(register)\删除(remo

C#设计模式——观察者模式(Observer Pattern)

一.概述在软件设计工作中会存在对象之间的依赖关系,当某一对象发生变化时,所有依赖它的对象都需要得到通知.如果设计的不好,很容易造成对象之间的耦合度太高,难以应对变化.使用观察者模式可以降低对象之间的依赖,以松耦合的方式实现这一目标.二.观察者模式观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新.其结构图如下: Subject知道它的所有观察者并提供了观察者注册和删除订阅的接口.Observer为那些在目标发生改变时需获得通知的对象定义

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

一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项目我们经常会用这些例子,这样避免了我们使用接口等那些依赖,比如电商项目中得降价通知,然后在来个生活中具体一点的比如公交车的例子,每一站都会对乘客进行提醒等等,我列举的这2个例子在我GITHUb上都有体现:下面用降价通知的Demo给大家具体来说一下,具体的代码还需要大家去下载观看: 二.观察者模式De

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

说说设计模式~观察者模式(Observer)

观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.. 何时能用到它? 此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况

jQuery中的观察者模式(Observer Pattern)

在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件,自然触发 比如,我们给页面的body元素绑定一个click事件,这样写. <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title&

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式