此文为转载,地址: http://yuyijq.cnblogs.com/

故事

小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。

小雪和男孩们的烦恼:

男孩们必须不断的询问小雪的位置变化,从而打断正常的工作小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问。如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式。

我们给小雪和男孩们提出了解决方案: 
     
      建议小雪购买一款带有GPRS功能的手机,该手机保存着所有追求者的电话号码,当该手机检测到小雪的位置发生变化时, 就会向所有追求者通知所在位置。这样一来,男孩们和小雪都各自都可以按照自己正常的生活习惯,只有小雪所在位置发生变化时候才会进行通信。

观察者模式(Observer)的解决方案

观察者模式的思想:观察者模式定义了被观察者与观察者对象之间一对多关系,当被观察者对象的状态发生改变时,多个观察者对象就会接受到通知。

观察者接口如下:

namespace XiaoXue
{
    public interface IObserver
    {
        void ShowAddress(string address);
    }
}

观察者类如下:

namespace XiaoXue
{
    public class BoyA : IObserver
    {
        public void ShowAddress(string address)
        {
            Console.WriteLine("小雪所在位置:" + address);
        }
    }
    public class BoyB : IObserver
    {
        public void ShowAddress(string address)
        {
            Console.WriteLine("小雪所在位置:" + address);
        }
    }
}

被观察者类如下:

namespace XiaoXue
{
    public class GPRSMobile
    {
        private ArrayList boys = new ArrayList(); //观察者列表 
        public GPRSMobile()
        {
            
        }
        public void AddBoy(IObserver b)
         {
              boys.Add(b);
         }
        //通知所有观察者 
       private void Notify(string address)
        {
            for (int i = 0; i < boys.Count; i++)
            {
                 IObserver boy=(IObserver)boys[i];
                 boy.ShowAddress(address);
            }
        }
        //当位置发生变化时执行
        public void OnAddressChanaged(string newAddress)
        {
            Notify(newAddress);
        }
    }
}

客户端调用如下:

BoyA boya=new BoyA();
BoyB boyb=new BoyB();

GPRSMobile mobile=new GRPSMobile()
mobile.AddBoy(boya);
mobile.AddBoy(boyb);

GPRS手机一旦监测所在位置发生变化,立即调用OnAddressChanaged方法发送信息
mobile.OnAddressChanaged("小雪在纽约向你问好!");

转载于:https://www.cnblogs.com/ruochen/archive/2007/12/16/996706.html

设计模式系列漫谈之一 - 观察者模式相关推荐

  1. Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

    前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...

  2. 设计模式系列之「观察者模式」

    最近小Y在看<反黑>这部剧,最引人回味的是堪称经典的山鸡哥飞上枝头变凤凰,当初的古惑仔弃暗投明做警察,可谓是涅槃重生啊. 张sir: 山鸡,和兴盛最近很嚣张啊,该是你大展身手的时候了,你要 ...

  3. 设计模式系列漫谈之二 - 工厂方法模式

    故事       10月1日是小雪的生日.许多追求者都想在生日那天给小雪一份意想不到的惊喜,并且表达自己的爱意.这些追求者绞尽脑汁的为小雪发送一个比较有创意的祝福短信.看来,小雪今年的生日过得肯定非常 ...

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

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

  5. 设计模式系列漫谈之五 - 迭代器模式

    故事    小美是小雪最好的朋友.有一天, 小美问小雪:"小雪,怎么你的手机短信这么多啊,是不是谈恋爱了?",小雪笑了一下,说:"还没呢",小雪停顿了一下,&q ...

  6. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  7. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  8. .NET设计模式系列文章

    .NET设计模式系列文章 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写 ...

  9. 收藏:TerryLee的.NET设计模式系列文章

    正打算就设计模式的学习写点什么,到cnblogs一查发现关于设计模式的系列已经有很多了,就免了.看了一下数TerryLee的系列写的易懂,将目录收藏在此. .NET设计模式系列文章 http://te ...

最新文章

  1. Java的类,对象以及字段和方法
  2. 常用地理数据平台及环境数据资源 (GIS)
  3. vsnprintf的作用和使用
  4. 单词拼接 ----- 深搜
  5. Mac 录制视频,并转为GIF格式
  6. js系列教程5-数据结构和算法全解
  7. 03.CSS选择器--交集并集选择器
  8. 如何用Python脚本从文件读取数据?
  9. 四叶草efi_四叶草启动器Clover EFI bootloader v5.0 r5111最新版
  10. HTML基础(新手入门教程)
  11. php temp 删除,c盘temp文件夹可以删除吗
  12. 浅谈在windows系统下esp8266和esp32开发共存一个eclipse编译器,非安信可一体化环境,而是搭建自己的eclipes环境。
  13. linux uvc 拍照程序,Linux UVC driver
  14. ie11不兼容window.createPopup的问题解决
  15. O2O优惠券核销-数据分析
  16. 持续集成与持续部署(五)01-TravisCI——使用简介-Travis CI 只支持 Github,提供的是持续集成服务 配置项目的.travis.yml文件
  17. idea莫名其妙打不开了怎么办
  18. DELL 6248交换机常用配置示例
  19. LTE 随机接入 --(1)流程
  20. sap发出商品差异差异分摊_什么是差异隐私?

热门文章

  1. LeetCode 978. 最长湍流子数组(DP)
  2. LeetCode 466. 统计重复个数(循环节)
  3. LeetCode 437. 路径总和 III(双重递归)
  4. 计算机软件无形资产机械工具,考前秘籍,无形资产的定义及确认
  5. python查看字符编码_python如何查看字符集
  6. paypal创建订单后怎么获得id_PayPal开放加密数字货币买卖 2021年将支持2600万家商户购物...
  7. python format 冒号_python之格式化输出
  8. python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】
  9. Android 行程APP简单介绍
  10. kakfa怎么看消息是否堆积_纯种哈士奇多少钱一只,怎么看是否是纯种哈士奇