极速理解设计模式系列: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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

自找麻烦

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的依赖注入…

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;你点的每个赞…

爱数应用容灾部署方案三

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

30张不明觉厉的照片,看几遍终于看懂了

全世界只有3.14 % 的人关注了爆炸吧知识网络上很多照片&#xff0c;虽然没经过PS&#xff0c;第一眼还是会觉得诡异。仔细看看才发现....哇噢&#xff01;总觉得她的头上有一撮尖尖的毛&#xff1f;狗狗怎么做得出这个表情&#xff1f;震惊&#xff01;发现没脖子的长颈鹿&…

排序集合的一个小坑

原来一直用SortList&#xff0c;SortedDictionary来作为键值对存储的排序集合来用&#xff0c;心中就默认是以key按ascall排序来存放的&#xff0c;在之前的案例中也没有出现问题&#xff0c;在最近一个demo中&#xff0c;打破了原来的自以为是的认识&#xff0c;因为在key中不…

爱是天时地利的迷信

1 别人撒娇你撒娇2 据说套着这个白袋子晒鞋鞋就不会发黄了。。3 蚂蚁&#xff1a;为什么要欺负我&#xff01;4 这是天空的心电图吗5 有回应的喜欢真好 6 随主人这事儿原来是真的…7 被别人喜欢时的心理活动图自回忆专用小马甲你点的每个赞&#xff0c;我都认真当成了喜欢

Juniper Firewall多进单出配制实例

Technorati 标签: juniper,多进单出,配置实例,firewallJuniper firewall多進單出配置。想法是這樣的用一台firewall將這幾條ISP線路都接入&#xff0c;再通過一個trunk口出來&#xff0c;通過一台L2 switch劃分出幾個VLAN&#xff0c;分別對應不同的ISP線路。這樣做的好處就不多…

刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?

▲ 点击查看 数学是个神奇的科目&#xff0c;它存在着一种“梯次掉队”的现象。不是说你低年级的知识学好了&#xff0c;高年级的知识就一定能学好。相信大家都有这种体会&#xff1a;一二年级孩子成绩不相上下&#xff0c;但到三四年级的时候&#xff0c;有一批学生的数学成绩…

android 系统之ContentProvider

基于上一篇的数据库操作&#xff0c;又写了一个ContentProvider的示例。把SQLiter 的数据提供出去供别的项目进行访问。 这一篇的代码要求熟悉SQLiter 的API. 首先&#xff0c;我们编写一个类extents ContentProvider &#xff0c;重写他的方法。 URI 在http 中我们称为统一资源…

你是中层管理者?嗯,一个表面看似风光,实际却很 “鸡肋” 的重要岗位

这是头哥侃码的第246篇原创每年的六七月份&#xff0c;上海都会进入梅雨季节。这段时期的上海天气就好比大小姐的脾气&#xff0c;阴晴不定&#xff0c;完全看心情做事&#xff0c;心情好的时候&#xff0c;给你个阳光&#xff0c;让你的生活和休闲时光多一些灿烂&#xff0c;心…

重温SQL——行转列,列转行(转:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html)...

行转列&#xff0c;列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现&#xff0c;也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法&#xff0c;比较好理解。层次清晰&#xff0c;而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法…

要男女朋友有什么用?

1 题&#xff1a;我不要面子的嘛&#xff01;2 狗都有人给撑伞了。。3 这大概就是传说中的一见钟情吧4 5 南方人说话有多软糯6 男女朋友有什么用你点的每个赞&#xff0c;我都认真当成了喜欢

低代码应用创新成果——轴承行业数字化智造系统(含MES/ERP/WMS)

轴承是当代机械设备中一种不可或缺的零部件&#xff0c;广泛应用于汽车、铁路车辆及各类工业机械和家用电器等国民经济的重要领域&#xff0c;是一种节约能源、提高效率的伟大发明。轴承行业作为装备制造业的先锋&#xff0c;一直以来都走在数字化转型的前列&#xff0c;引领行…

HelloSilverlight

一&#xff1a;输入姓名并选中一个日期&#xff0c;将在下面显示 二:XAML代码 <UserControl x:Class"HelloSilverlight.MainPage"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2…