极速理解设计模式系列:2.观察者模式(Observer Pattern)

4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver)
             被观察者(Subject/目标对象接口):目标对象的抽象接口

       具体被观察者(ConcreteSubject/具体目标对象):目标对象的具体实现,能够添加、删除具体对象并且通知所有的观察者对象。

       观察者:观察到目标对象的动作的时候有所反应的接口

       具体观察者:观察者对象的具体实现,并且有相关动作。
         实现思路:客户端创建目标对象,目标对象添加所有的观察者对象,然后目标对象更新,所有的观察者对象产生反应。

 类图:       


        应用场景:在Silverlight的某个系统中我们需要做一个消息通知管理,当接收到消息的时候,系统右下角弹出一个Tip窗口通知有消息,在系统的右上角出现一个短消息的图标开始闪亮表示有新消息。


        分析:在这里消息是一个类作为目标对象,而Tip窗口是另外一个类作为一个观察者;右上角的图标也是另外一个类,它控制图标是否闪亮,作为另外一个观察者。当消息出现的时候,通知两个观察者开始动作。

        下面我们在控制台程序去演示一下如何使用Observer Pattern:

        一、被观察者(Subject/目标对象接口)

    /// <summary>
/// 需要被观察的对象:目标对象
/// </summary>
interface IMsg
{
void AddObserver(IObs obs);
void RemoveObserver(IObs obs);
void Notify();
}

        二、具体被观察者(ConcreteSubject/具体目标对象)

   /// <summary>
/// 信息类
/// </summary>
class MsgClass:IMsg
{
List
<IObs> ObsList = new List<IObs>();

/// <summary>
/// 添加观察者
/// </summary>
/// <param name="obs"></param>
public void AddObserver(IObs obs)
{
ObsList.Add(obs);
}

/// <summary>
/// 移出观察者列表
/// </summary>
/// <param name="obs"></param>
public void RemoveObserver(IObs obs)
{
ObsList.Remove(obs);
}

/// <summary>
/// 通知观察者
/// </summary>
public void Notify()
{
Console.WriteLine(
"在这里目标对象属性变化");
foreach (IObs o in ObsList)
{ o.Active(); }
}
}

        三、观察者(Observer)

    /// <summary>
/// 观察者
/// </summary>
interface IObs
{
void Active();
}

        四、具体观察者(ConcreteObserver)

    class ObsTipShowMsg : IObs
{
public void Active()
{
Console.WriteLine(
"通过TipMessage的方式显示新信息");
}
}
class ObsLightShowMsg : IObs
{
public void Active()
{
Console.WriteLine(
"通过图标闪动方式通知新信息");
}
}

        五、客户端

    class Program
{
static void Main(string[] args)
{
MsgClass msg
= new MsgClass();

ObsTipShowMsg tipShowMsg
= new ObsTipShowMsg();
ObsLightShowMsg lightShowMsg
= new ObsLightShowMsg();
msg.AddObserver(tipShowMsg);
msg.AddObserver(lightShowMsg);
msg.Notify();
Console.ReadLine();
}
}

        如需源码请点击 ObserverPattern.rar 下载。

转载于:https://www.cnblogs.com/chengxingliang/archive/2011/08/22/2147142.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java try finally connectoin close_Java SocketChannel類代碼示例

本文整理匯總了Java中io.netty.channel.socket.SocketChannel類的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java SocketChannel類的具體用法&#xff1f;Java SocketChannel怎麽用&#xff1f;Java SocketChannel使用的例子&#xff1f;那麽恭喜您, 這裏精選的類代碼…

被娱乐在线报道的“唐骏造假门事件”

最近全球最热的是南非的世界杯&#xff0c;而在中国最近比较热的是另外一个事情。。。话说那天晚上回家已经很晚&#xff0c;照例的&#xff0c;家里的毛孩子歪歪斜斜的睡在床的角落里&#xff0c;一边是正在看节目的老婆吃着零食&#xff0c;我随便瞄了一眼&#xff0c;是新闻…

16年微软/腾讯云/华为云MVP是怎样炼成的

自由、创新、研究、探索&#xff0c;很难想象到一个IT大神的博客&#xff0c;会将“自由”放在第一位&#xff0c;也许这二字代表的&#xff0c;既是精神&#xff0c;又是情怀。搞微软技术的&#xff0c;大家或多或少都有听说过微软的“最有价值专家”&#xff08;MVP&#xff…

Dave Python 练习三 -- 对象

#encodingutf-8 #*************Part 1 : 对象 ****************** #Python 对象 #Python 使用对象模型来存储数据。构造任何类型的值都是一个对象。所有的Python 对像都拥有三个特性&#xff1a;身份&#xff0c;类型和值。 #身份&#xff1a; #每一个对象都有一个唯一的身份标…

java 注册驱动失败_java – JDBC驱动程序注册死锁?

在一个线程中,正在创建一个JackRabbit&#xff1a;"docs-on-startup" #32 prio5 os_prio0 tid0x00007f730d73e800 nid0x601d in Object.wait() [0x00007f725bffc000]java.lang.Thread.State: RUNNABLEat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Nat…

python3多线程queue_Python多线程(3)——Queue模块

Queue模块支持先进先出(FIFO)队列&#xff0c;支持多线程的访问&#xff0c;包括一个主要的类型(Queue)和两个异常类(exception classes)。Python 2 中的Queue模块在Python 3中更名为 queue。Queue对象的创建可以通过实例化Queue类型获得队列对象&#xff1a;创建新的队列&…

.NET中的设计模式---由吃龙虾想到的

作者: 倪大虾 发表于 2010-07-18 18:10 原文链接 阅读: 725 评论: 20今天吃小龙虾的时候忽然想到了以前一个湖北朋友讲的虾的故事.这位朋友是湖北人,据他说在他小时候他们那里很多虾,特别是夏天雨后,满地爬的都是.因为传说那是美国对付中国的秘密武器,居然没有人敢吃.后来偶然有…

【需要重视的BUG】:偷权限的情况

&#xff01;&#xff01;如果您生产环境用到了Blog.Core系统&#xff08;本文是我自己逻辑问题&#xff0c;和官方没关系哈&#xff09;&#xff0c;且没有做其他修改&#xff0c;且没有使用Ids4认证中心来授权认证&#xff0c;请看完本文&#xff0c;并即时做系统维护。-----…

Java实现文件过滤

Java实现文件过滤的方法&#xff0c;比如我只想获得某个路径下.java文件 只需要实现FilenameFilter这个接口即可。 比如&#xff1a; private class FileFilter implements FilenameFilter { public boolean accept(File dir, String name) { return name.en…

Angular运行在java_在本地运行现有Angular项目

我是Angular的新手&#xff0c;我正在尝试在我的机器上运行Angular的现有项目 . 我做了很多测试并且跟着很多文章 . 但无法运行我的项目 .我有这样的项目文件&#xff1a;我在我的系统上安装了nodejs . 并根据文章按照以下说明操作&#xff1a;将目录更改为我们的仓库cd myproj…

python作业题目用户输入行数、输出倒的等腰三角形_智慧职教云课堂APPPython程序设计(常州工业职业技术学院)作业期末考试答案...

在FANUC15系统中所采用的高分辨率绝对脉冲编码器&#xff0c;若每转输出脉冲数为100万个&#xff0c;最高允许转速10000r&#xff0f;min。如果当前和今后相当长一段时期&#xff0c;个人住房贷款市场中()将是一种主要的模式。A.多种机构的参与菱形ABCD中&#xff0c;AB2&#…

自找麻烦

2019独角兽企业重金招聘Python工程师标准>>> 真是想狗想的要发疯了&#xff0c;所以想买条狗&#xff0c;但是阿拉斯加&#xff0c;哈士奇&#xff0c;金毛&#xff0c;拉布拉多&#xff0c;苏牧&#xff0c;喜乐蒂现在我都买不起&#xff0c;他们都是很听话的狗&am…

Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能

前言在使用PRISMWPF开发项目的过程中&#xff0c;需要使用AutoMapper实现对象-对象的映射功能。无奈PRISM没有相关对AutoMapper相关的类库&#xff0c;于是转换一下思想&#xff0c;在nuget 中存在有关使用Microsoft.Extensions.DependencyInjection来实现AutoMapper的依赖注入…

【机房真是】。。。各种蛋疼。。。

渣渣。。。呵呵。。。预流推进什么的。。。呵呵。。。。渣渣。。。渣渣。。。、、走了。。。 转载于:https://www.cnblogs.com/Aoi3x/archive/2011/09/07/2645360.html

webSocket原理及其案例

常见的消息推送方式 1&#xff1a;轮询方式 浏览器以指定的时间间隔向服务器发出HTTP请求&#xff0c;服务器实现试试返回数据给浏览器 缺点&#xff1a;数据有延时、服务器压力较大。 2&#xff1a;长轮询 浏览器发出ajax&#xff08;异步&#xff09;请求&#xff0c;服…

这是啥?也太秀了吧?

1 请坐下2 这是什么愿望&#xff0c;感觉老天都看不下去了&#xff01;3 像极了手机落在上铺的你&#xff01;4 真正智慧家居&#xff0c;免通电。5 你以为它是土豆&#xff0c;其实。。6 葫芦不一定叫葫芦葫芦有各种奇奇怪怪的形状和名字7 我发光去了&#xff01;你点的每个赞…

php七牛分片上传_利用七牛的php SDK分片上传时如何处理Notify?

我的代码如下&#xff0c;有填写相应的Rio_PutExtra&#xff0c;但是进度貌似没有输出来&#xff1f;请问是哪里写的不对么&#xff1f;…function upload($bucket, $key, $file, $type"file"){$qiniu_key "…AK…";$qiniu_sec "…SK…";Qiniu…

python课程思路_学习python课程第二十六天

一. 传输层在上述三层协议中我们,ip协议帮我们定位到子网络. mac地址帮我们定位到一台计算机,并与其通讯,但本质上,计算机的通讯是为了应用程序能够通讯,而一台计算机上不可能运行一个应用程序问题:就像我们同时运行QQ软件和微信软件, 当计算机收到一个数据包时, 需要知道这…

爱数应用容灾部署方案三

级联复制的异地容灾方案部署 爱数应用容灾部署方案可在异地部署远程容灾站点实现远程应用容灾方案&#xff0c;采用级联复制模型&#xff0c;在本地和远程分别部署容灾站点&#xff0c;克服实时复制对带宽延迟较高的缺点&#xff0c;获得最佳的容灾效果。并且可根据用户的网络和…

c# 按位与,按位或

最近在园子里看到了这篇文章&#xff0c;看完这篇会有意外收获&#xff1a;C#枚举高级战术https://mp.weixin.qq.com/s/yipaL6Acil-uxq_bDDgdyg想起了很久之前的自己的一篇总结&#xff0c;特地找出来------在工作中遇到按位或组合权限串。一直不是特别明白。今天终于花了半个下…