首先推荐一下别人写的,很不错可以参考,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 (二):观察者模式的更多相关文章

  1. 设计模式 (二)——观察者模式(Observer,行为型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(Observer Pattern)属于行为型模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都 ...

  2. Java设计模式の观察者模式(推拉模型)

    目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...

  3. 浅谈vue响应式原理及发布订阅模式和观察者模式

    一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...

  4. Cocos2dx开发之设计模式

    cocos2dx的几种常见设计模式 一 单例模式 Cocos2dx中的单例有:CCDirector,CCTextureCache,CCSpriteFrameCache,CCScriptEngineMa ...

  5. Java设计模式博客全文件夹

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代 ...

  6. 设计模式(二)The Observer Pattern 观察者模式

    问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...

  7. 委托、事件、Observer观察者模式的使用解析二

    一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...

  8. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  9. Java设计模式(二) 观察者模式

    观察者模式: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会受到通知并自动更新. 1,定义事件源接口 package com.pattern.observer; pub ...

  10. 观察者模式(二)--《Head First DesignPattern》

    我们用Java中自带的观察者模式接口来重写前面的例子. 先看一下类图: 这里用到了一个setChanged函数,它用来标记状态已经改变的事实,好让notifyObservers()知道当它调用时就应该 ...

随机推荐

  1. Hangman游戏源代码 --- python实现

    #hangman.py from PythonCard import model,dialog import random def find_letters(letter,a_string): loc ...

  2. HTML精确定位之位置参数乱炖一锅

    一.前言 公司项目,需要在一个图片的右上角放置一个类似“X”的东西(其实是需要显示一个数字,就像微信一样,在右上角显示几个消息),然后需要用到html的定位,看了几个网上的例子,恍惚间看到了一个off ...

  3. JVM GC Q&A(补充ing)

    1.如果一个对象没有与其相连的GC ROOT,一定会被回收吗? 这个对象并非是非死不可的,这时他只是处于死缓阶段,要真正宣告一个对象的死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现并没有 ...

  4. Luogu3960 NOIP2017列队(splay/线段树)

    令splay中的一个点表示一段区间,需要使用其中某个点时将区间分裂即可,剩下的都是splay的基本操作了.写的非常丑陋,注意细节.感觉考场上肯定只能靠部分分苟活了.想起来去年因为各种莫名其妙的原因50 ...

  5. [bzoj1056] [HAOI2008]排名系统

    Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...

  6. [NOIP2002] 字串变换 宽搜+深度优化

    这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...

  7. weblogic的安装和注意的问题以及在idea怎么用weblogic启动一个web服务

    第一步下载weblogic: 大家可以通过我的网盘下载weblogic,地址如下 https://pan.baidu.com/s/1NkZ_Gd-xfim5YGcdtjYoUw 第二步安装weblog ...

  8. bzoj 4879 失控的数位板 4881 线段游戏 贪心,瞎搞

    [Lydsy1705月赛]失控的数位板 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 148  Solved: 33[Submit][Status][ ...

  9. lwIP配置文件opt.h和lwipopts.h

    如何去配置lwip,使它去适合不同大小的脚,这就是lwIP的配置问题.尤其是内存的配置,配置多了浪费,配置少了跑不了或者不稳定(会出现的一大堆莫名奇妙的问题,什么打开网页的速度很慢啊?什么丢包啊,什么 ...

  10. 解析 Array.prototype.slice.call(arguments,0)

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...