文档章节

设计模式:观察者模式

凯文加内特
 凯文加内特
发布于 2015/03/02 11:04
字数 419
阅读 102
收藏 2


今天介绍另一种模式

观察者模式是我们经常用的一个模式,比如在用wcf做服务的时候通知客户端做一些操作一般用设计者模式。

今天做一个订报纸的小例子来理解一下观察者模式  出版者+订阅者=观察者模式

                                用下边的图来说就是    人民日报+订阅者=观察者模式

只要是订阅了人民日报的人,有了新报纸就会送到订阅者那里去,

当你不想订的时候取消就不订阅就不会再收到报纸了。

下面我们就来用代码实现一下这个模式

//报纸接口
   public interface INewsPaper
   {
       //添加订阅者
       void RegisterSubscriber(ISubScribe f_subScribe);
       //取消订阅
       void RemoveSubScriber(ISubScribe f_subScribe);
       //发送报纸
       void SendPaper();
   }
 
   //订阅者
   public interface ISubScribe
   {
       //有新的报纸了就会被执行通知
       void HasNewPaper();
   }
   //人民日报
   public class PeopleNewsPaper : INewsPaper
   {
       private List<ISubScribe> subList = new List<ISubScribe>();
       public void RegisterSubscriber(ISubScribe f_subScribe)
       {
           subList.Add(f_subScribe);
       }
 
       public void RemoveSubScriber(ISubScribe f_subScribe)
       {
           if (subList.IndexOf(f_subScribe) >= 0)
           {
               subList.Remove(f_subScribe);
           }
       }
 
       //发报纸啦~~
       public void SendPaper()
       {
           foreach (ISubScribe _sub in subList)
           {
               _sub.HasNewPaper();
           }
       }      
   }
 
   public class subHuman : ISubScribe
   {
       //订阅者的名字
       private string p_name;
 
       public subHuman(string f_name)
       {
           p_name = f_name;
       }
       //告诉订阅者有新报纸了
       public void HasNewPaper()
       {
           Console.WriteLine(p_name + "!! 有新的报纸了,请查收!");
       }
        
   }

开始订订阅,和调用了

static void Main(string[] args)
        {
            PeopleNewsPaper _paper = new PeopleNewsPaper();
            subHuman _XiaoMing = new subHuman("小明");
            subHuman _ZhaoYun = new subHuman("赵云");
            subHuman _LiuBei = new subHuman("刘备");
            //小明订报
            _paper.RegisterSubscriber(_XiaoMing);
            //赵云订报
            _paper.RegisterSubscriber(_ZhaoYun);
            //刘备订报
            _paper.RegisterSubscriber(_LiuBei);
            //有新报纸了
            _paper.SendPaper();
            Console.WriteLine("---------------发完报纸了------------------");
 
            //小明不想订了,取消报纸
            _paper.RemoveSubScriber(_XiaoMing);
            //又有新报纸了  就没有小明的报纸 了
            _paper.SendPaper();
            Console.ReadLine();
        }

本文转载自:http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html

共有 人打赏支持
凯文加内特
粉丝 337
博文 678
码字总数 103855
作品 0
青岛
后端工程师
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 权限

权限 0 000 --- 无权限 1 001 --x 执行权限 2 010 -w- 写权限 3 011 -wx 写和执行 4 100 r-- 读权限 5 101 r-x 读和执行 6 110 rw- 读和写 7 111 rwx 读写执行 755 : rwxr-xr-x 660 : rw-r...

忙碌的小蜜蜂
22分钟前
0
0
21分钟教会你分析MaxCompute账单

21分钟教会你分析MaxCompute账单 背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账...

阿里云云栖社区
26分钟前
0
0
Docker使用 linuxserver/letsencrypt 生成SSL证书最全解析及实践

本文使用 HTTP 和 DNS 两种校验方式对 Docker 下 linuxserver/letsencrypt 项目进行了实践。生成SpringBoot可用证书,使用 Nginx 的 htpasswd 来对网站进行密码保护,并测试使用 fail2ban 防...

java菜分享
26分钟前
0
0
代码吃鸡:Python-Robocode

最近看到一个很有“未来感”的新闻: 一辆特斯拉在拉斯维加斯出了车祸,撞“死”了一个……emmmm……机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中...

crossin
30分钟前
0
0
什么是公网IP、内网IP和NAT转换?

搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么? 1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网I...

Linux就该这么学
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部