23种设计模式之观察者模式(Observer)
观察者模式又称为发布—订阅模式、模型—视图模式、源-监听器模式或从属者(dependents)模式,是一种对象的行为型模式。它定义了对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。观察者模式的优点在于实现了表示层和数据层的分离,并定义了稳定的更新消息传递机制,类别清晰,抽象了更新接口,使得相同的数据层可以有各种不同的表示层。
优点:
1)抽象了主体与Observer之间的耦合关系。
2)支持广播方式的通信。
使用场景:
1)对一个对象的修改涉及对其它对象的修改,而且不知道有多少对象需要进行相应修改。
2)对象应该能够在不用假设对象标识的前提下通知其它对象。
public interface Observer
{
void Update(Subject subject);
}
public interface Subject
{
void Attach(Observer docExplorer);
void Detach(Observer docExplorer);
void NotifyObservers();
}
public class DocExplorer : Observer
{
public void Update(Subject subject)
{
Console.WriteLine("更新DocExplorer自身的状态");
}
}
/// <summary>
/// 公文类
/// </summary>
public class OfficeDoc : Subject
{
//存储与OfficeDoc相关联的DocExplorer对象
private IList<Observer> observerList = new List<Observer>(); /// <summary>
/// 将某DocExplorer对象与OfficeDoc相关联
/// </summary>
/// <param name="docExplorer"></param>
public void Attach(Observer docExplorer)
{
observerList.Add(docExplorer);
} /// <summary>
/// 解除某DocExplorer对象与OfficeDoc的关联关系
/// </summary>
/// <param name="docExplorer"></param>
public void Detach(Observer docExplorer)
{
observerList.Remove(docExplorer);
} /// <summary>
/// 通知所有的DocExplorer对象
/// </summary>
public void NotifyObservers()
{
IEnumerator enumeration = observerList.GetEnumerator();
while (enumeration.MoveNext())
{
Observer observer = enumeration.Current as Observer;
observer.Update(this);
}
}
}
class Program
{
static void Main(string[] args)
{
//观察者设计模式
Subject subject = new OfficeDoc();
Observer doc = new DocExplorer();
subject.Attach(doc);
subject.Attach(doc);
subject.Attach(doc);
subject.NotifyObservers();
}
}

23种设计模式之观察者模式(Observer)的更多相关文章
- 实践GoF的23种设计模式:观察者模式
摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- 【Unity与23种设计模式】观察者模式(Observer)
GoF中定义: "在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知." 现实中,社交网络就是个例子. 以前的报社,每次出新刊的时候, 报刊便 ...
- 23种设计模式之观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者.当一个对象改变需要同时改变其他对象, ...
- 23种设计模式 - 组件协作(TemplateMethod - Observer/Event - Strategy)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 组件协作 现代软件专业分工之后的第一个结果是"框架与应用程序的划分","组件 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
随机推荐
- hdu 5086 Revenge of Segment Tree(BestCoder Round #16)
Revenge of Segment Tree Time Limit: 4000/20 ...
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...
- Java基础之深入理解Class对象与反射机制
深入理解Class对象 RRIT及Class对象的概念 RRIT(Run-Time Type Identification)运行时类型识别.在<Thinking in Java>一书第十四 ...
- qt creator如何实现转到槽功能
ui_mainwindow.h .
- 前端可视化编程:liveReload安装,sublime 3
需要插件 sublime text3:View in Browser:LiveReload chrome:liveReload 配置方法 一:sublime text3 sublime 3下载地址: ...
- Java实现经理与员工的差异
对于在同一家公司工作的经历和员工而言,两者是有很多共同点的.例如,每个月都要发工资,但是经理在完成目标任务后,还会获得奖金.此时,利用员工类来编写经理类就会少写很多代码,利用继承技术可以让经理类使用员 ...
- logstash结合rsyslog,收集系统日志
rsyslog是日志收集工具.如今非常多Linux都自带rsyslog,用其替换掉syslog.怎样安装rsyslog就不讲了.大概讲下原理.然后讲logstash的相关配置. rsyslog本身有一 ...
- 用XYNTService把Python程序变为服务
1. XYNTService的使用 1.1. 介绍 1.2. XYNTService 2. 用XYNTService把Python程序变为服务 1. XYNTService的使用 1.1. 介绍 通常 ...
- WPF设置样式的几种方式
第一种方式是直接使用Setter来进行,可以对Background等进行设置. <Window.Resources> <Style TargetType="Button&q ...
- Springboot启动后报错【This application has no explicit mapping for /error, so you are seeing this as a fallback····】
This application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Dec 1 ...