行为型模式 - 观察者模式Observer
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

有一个大佬视频中提过一个案例,我觉得很棒:遥闻深巷中犬吠,边有妇人惊觉欠伸,其夫呓语。继而儿醒,大啼。夫亦醒。
模式的定义与特点
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
观察者模式是一种对象行为型模式,其主要优点如下。
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
- 目标与观察者之间建立了一套触发机制。
它的主要缺点如下。
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
模式的结构与实现
实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。
1. 模式的结构
观察者模式的主要角色如下。
- 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
观察者模式的结构图如图 1 所示。
using DesignPattern.ObserverPattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
ObserverHelper();
}
#region Pattern - Observer
static void ObserverHelper()
{
SubjectItem1 subject = new SubjectItem1();
subject.AddObserver(new ObserverItem1(subject));
subject.AddObserver(new ObserverItem2(subject));
subject.AddObserver(new ObserverItem3(subject));
subject.Age = 23;
subject.Notify();
Console.ReadLine();
}
#endregion
}
}
//==============================================================================================================
using System.Collections.Generic;
namespace DesignPattern.ObserverPattern
{
public abstract class Subject
{
private List<Observer> Observers = new List<Observer>();
public void AddObserver(Observer observer)
{
Observers.Add(observer);
}
public void RemoveObserver(Observer observer)
{
Observers.Remove(observer);
}
public void Notify()
{
foreach (var item in Observers)
{
item.BeNotified();
}
}
}
public class SubjectItem1 : Subject
{
public int Age { get; set; } = 18;
}
}
//==============================================================================================================
using System;
namespace DesignPattern.ObserverPattern
{
public abstract class Observer
{
public abstract void BeNotified();
}
public class ObserverItem1 : Observer
{
SubjectItem1 subjectItem;
public ObserverItem1(Subject subject)
{
subjectItem = (SubjectItem1)subject;
}
public override void BeNotified()
{
Console.WriteLine("观察者 1 收到了消息,确认信息为:" + subjectItem.Age);
}
}
public class ObserverItem2 : Observer
{
SubjectItem1 subjectItem;
public ObserverItem2(Subject subject)
{
subjectItem = (SubjectItem1)subject;
}
public override void BeNotified()
{
Console.WriteLine("观察者 2 收到了消息,确认信息为:" + subjectItem.Age);
}
}
public class ObserverItem3 : Observer
{
SubjectItem1 subjectItem;
public ObserverItem3(Subject subject)
{
subjectItem = (SubjectItem1)subject;
}
public override void BeNotified()
{
Console.WriteLine("观察者 3 收到了消息,确认信息为:" + subjectItem.Age);
}
}
}

总结:
被观察者(Subject)就像明星,而观察者(Observer)就像是媒体,当明星做了一件什么事情后想被大众知道时,就告诉媒体。
希望大家:点赞,留言,关注咯~
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
今日推荐
行为型模式 - 观察者模式Observer的更多相关文章
- 行为型模式之Observer模式
观察者模式(又被称为发布-订阅模式.模型-视图模式.源-收听者模式或从属者模式) 观察者模式中,一个目标对象管理所有依赖于它的观察者对象,并且在它本身的状态改变时主动发出通知. 应用场景 拍卖会可以认 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- NET设计模式 第二部分 行为型模式(18):观察者模式(Observer Pattern)
概述 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御 ...
- 设计模式18:Observer 观察者模式(行为型模式)
Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现
课程名称:程序设计方法学 实验5:OOP设计模式-行为型模式的应用与实现 时间:2015年12月02日三,第3.4节地点:理 一.实验目的 加深对行为型设计模式的理解以及在开发中的实际应用能力. 二. ...
- [19/05/02-星期四] GOF23_行为型模式(状态模式、观察者模式、备忘录模式)
一.状态模式 [状态接口] /*** * 房间"状态"接口 */ package cn.sxt.state; public interface State { void handl ...
- Java设计模式之行为型模式
行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...
- 第28章 行为型模式大PK
27.1 策略模式 VS 命令模式 27.1.1 策略模式实现压缩算法 //行为型模式大PK——策略模式和命令模式 //实例:用策略模式实现压缩算法 #include <iostream> ...
随机推荐
- java学习之爬虫
0x00前言 对比与Python的爬虫机制和java的爬虫机制来详解一下java的爬虫,对于一般性的需求无论java还是python都可以胜任. 如需要模拟登陆.对抗防采集选择python更方便些,如 ...
- 【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?
原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated 原文作者:Nam Ha Minh 原文发表日期:20 ...
- Azure Devops Create Project TF400711问题分析解决
前几天,团队使用Azure Devops创建团队项目出了一个奇怪的错误: TF400797: 作业扩展具有一个未处理的错误: Microsoft.TeamFoundation.Framework.Se ...
- 手记系列之三 ----- 关于使用Nginx的一些使用方法和经验
前言 本篇文章主要介绍的关于本人在使用Nginx的一些使用方法和经验~ Nginx介绍 介绍 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所 ...
- 用 vue3 中的 reduce(累加器) 随机生成100个字母,放入数组中,统计每个字母出现的次数
一.首先不用 reduce() 来实现 代码如下: <template lang=""> <div> <h1>统计每个字母出现的次数,不使用r ...
- 2022-11-10 Acwing每日一题
本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...
- 深入理解Golang 闭包,直通面试
大家好 今天为大家讲解的面试专题是: 闭包. 定义 闭包在计算机科学中的定义是:在函数内部引用了函数内部变量的函数. 看完定义后,我陷入了沉思...确实,如果之前没有接触过闭包或者对闭包不理解的话,这 ...
- i春秋Musee de X
打开提示我们如果要操作就需要登录 题目也没有给出tips提示 /tmp/memes/wosun 注册成功后提示我们我们的文件被储存在了.....可能这道题会用到一句话木马,毕竟他目录都给我们了 然后去 ...
- 关于deepin-wine或wine更换字体方法
前言 首先要知道,deepin-wine打包的QQ和你自己用 deepin-wine跑的windows软件,他们所在不是同一个容器 deepin打包QQ所在的容器,在你的 ~/.deepinwine ...
- day14 I/O流——序列化与反序列化 & 计算机网络五层架构 & TCP的建立连接与断开连接
day 14 序列化与反序列化 序列化 将对象转化成特定格式的字符串文件(字节文件)叫做序列化 1.一个类要想实现序列化,必须实现serializable接口 2.序列化用途 1)把对象的字节序列 ...