head first (二):观察者模式
首先推荐一下别人写的,很不错可以参考,http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html
1.定义
观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态时,依赖它的对象都会收到通知并自动更新。
原则:为交互对象之间的松耦合设计而努力
2:使用场景
传统例子,订阅报纸,报纸为主题,订阅者为观察者,当报纸更新时,订阅者就会收到最新的报纸。
3:代码实现
★主题(报纸的接口和实现),更新报纸,添加,删除,通知观察者
interface IPaper
{
void UpdatePaper(string Content); void RegisterObserver(IMan man); void RemoveObserver(IMan man); void NotifyObserver(string content);
}
public class PeoplePaper : IPaper
{
private List<IMan> manList; public void RegisterObserver(IMan man)
{
manList.Add(man);
} public void RemoveObserver(IMan man)
{
if (manList.IndexOf(man) >= )
{
manList.Remove(man);
}
} public void NotifyObserver(string content)
{
foreach (IMan man in manList)
{
man.Update(content);
}
} public PeoplePaper()
{
manList = new List<IMan>();
}
public void UpdatePaper(string Content)
{
string strContent = "人民日报" + DateTime.Now.ToString() + "发布:" + Content;
NotifyObserver(strContent);
}
}
★观察者接口与实现,接受更新信息
public interface IMan
{
void Update(string content);
}
class FirstMan : IMan
{
public void Update(string content)
{
Console.WriteLine("小明收到了{0}",content);
}
}
class SecondMan : IMan
{
public void Update(string content)
{
Console.WriteLine("小红收到了{0}", content);
}
}
★使用订阅与取消订阅
static void Main(string[] args)
{
PeoplePaper paper = new PeoplePaper(); FirstMan first = new FirstMan(); SecondMan second = new SecondMan(); paper.RegisterObserver(first);
paper.RegisterObserver(second); paper.UpdatePaper("美美的事好假!"); paper.RemoveObserver(first); paper.UpdatePaper("云南地震了!"); Console.ReadKey(); }

4:思考与小结
山石晓月:
个人感觉这个例子有点不符合常情了。报纸的订阅或者取消是有人通知报纸商的,而例子中却直接由报纸商发起。如果要恰当的表示中间应该加代理,而不能够用单独的观察者来表示,仅仅个人意见。
bluejance:
这些代码就是
报纸的订阅或者取消是有人通知报纸商的
没有人订阅报纸商发的什么报纸。
可能是我的第一个图画的不好,让你有点误解了
山石晓月:
呵呵,你这发起者明明就是 报纸么....
其实实现和别人的一样,但是我觉得有必要自己写一下代码。上面推荐文章中有位朋友的问题我也想了好久,最后发现用代理也需要在paper里面加代理,其实这只是理解的问题,人订阅报纸,报纸添加订阅者其实是同一件事,只是在订阅者类中实现订阅,最终还是要在paper更新时找寻所有的订阅者,循环去发送更新。
head first (二):观察者模式的更多相关文章
- 设计模式 (二)——观察者模式(Observer,行为型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(Observer Pattern)属于行为型模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都 ...
- Java设计模式の观察者模式(推拉模型)
目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...
- 浅谈vue响应式原理及发布订阅模式和观察者模式
一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...
- Cocos2dx开发之设计模式
cocos2dx的几种常见设计模式 一 单例模式 Cocos2dx中的单例有:CCDirector,CCTextureCache,CCSpriteFrameCache,CCScriptEngineMa ...
- Java设计模式博客全文件夹
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代 ...
- 设计模式(二)The Observer Pattern 观察者模式
问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...
- 委托、事件、Observer观察者模式的使用解析二
一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- Java设计模式(二) 观察者模式
观察者模式: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会受到通知并自动更新. 1,定义事件源接口 package com.pattern.observer; pub ...
- 观察者模式(二)--《Head First DesignPattern》
我们用Java中自带的观察者模式接口来重写前面的例子. 先看一下类图: 这里用到了一个setChanged函数,它用来标记状态已经改变的事实,好让notifyObservers()知道当它调用时就应该 ...
随机推荐
- hdu2421(数学,因式分解素数筛)
Xiaoming has just come up with a new way for encryption, by calculating the key from a publicly view ...
- Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本
资源可以用,但是安装完成后启动会报错:“要继续使用此程序,您必须应用最新的更新或使用新版本” 解决办法先修改你电脑时间为前一年(2017 1月),然后就可以打开xshell了,打开后"工具& ...
- 好用的在线pdf转化器
https://smallpdf.com/cn/compress-pdf
- Spark分布式执行原理
Spark分布式执行原理 让代码分布式运行是所有分布式计算框架需要解决的最基本的问题. Spark是大数据领域中相当火热的计算框架,在大数据分析领域有一统江湖的趋势,网上对于Spark源码分析的文章有 ...
- 51nod 1851俄罗斯方块(trick)
题目大意:给出一个黑白图,你可以选定一个俄罗斯方块的区域,黑白翻转,问能否变成白图 比较trick的题目, 首先可以想到,奇数个1肯定是无解的,所以考虑偶数个1 可以先讨论n是2的情况 当n为2时,其 ...
- C++——设计与演化——读书笔记
<<c++设计与演化>>1.c++的保护模式来自于访问权限许可和转让的概念; 初始化和赋值的区分来自于转让能力的思考; c++的const概念是从读写保护机制中演化出来. 2. ...
- 【17.12.22.B】
B 题面描述: 给一个长度为n的序列,a[1], a[2], ... , a[n], 选出连续的k个数,使得这k个数的最大值加这k个数的or值最大. 假设选出的数为a[l], a[l + 1], .. ...
- CentOS 7, 升级python到3.x
By francis_hao Apr 11,2017 使用源码安装方式 首先到官网https://www.python.org/downloads/source/ 下载python最新版本.当前 ...
- Fragment里使用 PhoneGap 的 CordovaWebView
首先说明一下为什么要使用 CordovaWebView 而不直接使用 WebView 呢?由于 Android4.4 版本之后对 WebView 做了很大的改变,具体参考 这篇文章:理解WebKit和 ...
- CodeSmith和PowerDesigner (转)
首先,既然要讲解如何使用CodeSmith和PowerDesigner快速生成批量代码,当然要先安装这2个软件啦,下面就简单说说如何安装破解这2款软件吧,当然破解只是学习之用,请大家不要用于商业用途哈 ...