设计模式之观察者模式
时间:2022-07-22
本文章向大家介绍设计模式之观察者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之观察者模式
结构
说明
Define a one-to-many dependency between objects where a state change in one object results with all its dependents being notified and updated automatically.
在对象间定义一个一对多的联系性,由此当一个对象改变了状态,所有其他相关的对象会被通知并且自动刷新。
适用条件
- 当抽象个体有两个相互依赖的层面时。 封装这些层面在单独物件内将可允许程序设计师单独地去变更与重复使用这些物件, 而不会产生两者之间的交互问题;
- 当其中一个物件的变更会影响其他物件, 却又不知道多少无间必须被同时更新;
- 当物件应该有能力通知其它物件, 又不应知道其他物件的实现细节时。
实现
public interface ISubject {
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify();
}
public interface IObserver {
void Update();
}
public class ConcreteSubject : ISubject {
private readonly IList<IObserver> _observers = new List<IObserver>();
public string State {
get;
set;
}
public void Attach(IObserver observer) {
if (!this._observers.Contains(observer)) {
this._observers.Add(observer);
}
}
public void Detach(IObserver observer) {
if (this._observers.Contains(observer)) {
this._observers.Remove(observer);
}
}
public void Notify() {
foreach (var observer in _observers) {
observer.Update();
}
}
}
public class ConcreteObserver : IObserver {
private readonly ConcreteSubject _subject;
public ConcreteObserver(ConcreteSubject subject) {
this._subject = subject;
}
public void Update() {
Console.WriteLine("Observer: subject state updated to {0} .", this._subject.State);
}
}
class Client {
static void Main(string[] args) {
var subject = new ConcreteSubject();
subject.Attach(new ConcreteObserver(subject));
subject.Attach(new ConcreteObserver(subject));
subject.State = "State1";
subject.Notify();
subject.State = "State2";
subject.Notify();
Console.ReadKey();
}
}
.Net 4.0 内置了 IObservable 与 IObserver 接口用于实现观察者模式, 这两个接口的定义如下:
public interface IObservable<out T> {
IDisable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T> {
void Next(T value);
void OnError(Exception ex);
void OnCompleted();
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 嘿,你知道新冠疫情现在什么样了吗?
- 关于双目立体视觉的三大基本算法及发展现状的总结
- 权限维持之打造不一样的映像劫持后门
- SM3加密算法开源项目推荐
- 图片压缩原理
- 使用 Vue 3.0,你可能不再需要Vuex了
- ffmpeg视频处理神器学习基础笔记
- 5分钟就能做一个Excel动态图表,你确定不学学?(纯gif教学)
- 使用Logstash接收Netflow日志并发送到syslog服务器
- Flask搭建ES搜索引擎(二)
- Java 通过RestHighLevelClient 使用ES的date_histogram 根据年月日做统计
- Debug HashMap
- NSum及股票系列
- 从0开始搭建编程框架——主框架和源码
- C++拾取——使用stl标准库生成等差、等比数列的方法