设计模式笔记 18. Observer 观察者模式(行为型模式)
18. Observer 观察者模式 2008-09-15
动机(Motivation)
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
意图(Intent)
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》GoF
示意代码:
//有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
abstract class Subject
{
private IList<Observer> observers = new List<Observer>();
//增加观察者
public void Attach(Observer observer)
{
observers.Add(observer);
}
//移除观察者
public void Detach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach (Observer o in observers)
o.Update();
}
}
//在具体主题的内部状态改变时,给所有登记过的观察者发出通知
class ConcreteSubject : Subject
{
private string subjectState;
//具体通知者状态
public string SubjectState
{
get { return subjectState; }
set { subjectState = value; }
}
}
abstract class Observer
{
public abstract void Update();
}
//以便使本身的状态与主题的状态相协调
class ConcreteObserver : Observer
{
private string name;
private string observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject, string name)
{
this.subject = subject;
this.name = name;
}
//更新
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("观察者{0}的新状态是{1}",
name, observerState);
}
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
}
客户端代码:
{
static void Main(string[] args)
{
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s, "X"));
s.Attach(new ConcreteObserver(s, "Y"));
s.Attach(new ConcreteObserver(s, "Z"));
s.SubjectState = "ABC";
s.Notify();
Console.Read();
}
}
Observer 的几个要点
使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。
在C#的event中,委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。
适用性
1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
转载于:https://www.cnblogs.com/MaoBisheng/archive/2008/09/15/1291130.html
设计模式笔记 18. Observer 观察者模式(行为型模式)相关推荐
- 设计模式 ( 十七 ):Observer 观察者模式 -- 行为型
1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是 ...
- 23种设计模式介绍(一)---- 创建型模式
由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...
- 【设计模式】(八)--创建型模式--建造者模式
[设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...
- 【设计模式】三大类:创建型模式、结构型模式、行为型模式
1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...
- python与网页设计的区别_Python与设计模式(三):行为型模式(上)
接前文:kant li:Python与设计模式(二):结构型模式(下)zhuanlan.zhihu.com 行为型模式主要处理对象间的通信问题,包括责任链模式.命令模式.解释器模式.迭代器模式.观察 ...
- 设计模式其实很简单之行为型模式
关注公众号获取更多资料 设计模式- 行为型模式 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. 行为型模式是23中设计模式 ...
- 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...
- 设计模式混编:观察者模式+中介者模式
针对变化万千的业务需求,采用合适的设计模式是可以轻松应对的. 本文将探索多种优秀设计模式的混编来解决复杂场景的问题,实现1+1>2的效果.应用实践离不开基础,所以文章将以基本概念.设计初衷出发, ...
- C#面向对象设计模式纵横谈——Singleton单件(创建型模式)
Singleton单件(创建型模式) 动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的 ...
最新文章
- SAP MM 项目上线库存初始化导入问题 --- 进口物料在途库存之处理
- Java学习3之成员方法及函数重载
- flutter apk 打包
- 51Nod - 1024 矩阵中不重复的元素(数学)
- Jenkins配置Findbugs做源代码安全扫描
- 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言
- Netty工作笔记0005---NIO介绍说明
- aida32系统信息报告
- 使用 rem 布局的优缺点?
- 赚自己的淘宝佣金,让返利网无路可走
- 自强不息系列之Java 实例 - 线程优先级设置
- 区块链游戏企鹅大陆上线10000创始限时开放注册
- 【python】蓄水池
- Python基础 函数
- 淘淘商城分布式电商系统项目总结
- 「牛客网C」初学者入门训练BC139,BC158
- 新手小白如何开始网络赚钱?最靠谱的实操方法来了!
- 父母不要对孩子说的10句话
- 数模常用查找数据网址大全
- NJU数电实验1-3
热门文章
- springboot在intellij中的热部署(Hot swapping)配置
- Django的电子商务网站的调研
- windows7 64位下安装tensorflow终极解决方案
- ext不能选中复制属性_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
- 商品表有哪些字段_面试中有哪些经典的数据库问题?
- php 超链接新页面打开新页面,Typecho 超链接默认新窗口打开
- oracle的脚本语言,Oracle 无法执行SQL脚本语句
- mysql中的extract()函数
- find命令---Linux学习笔记
- Android中Intent传递Object和ArrayListObject对象---笔记