0.C#设计模式--简单工厂模式

1.C#设计模式--工厂方法模式

2.C#设计模式--抽象工厂模式

3.C#设计模式--单例模式

4.C#设计模式--建造者模式

5.C#设计模式--原型模式

6.C#设计模式--设配器模式

7.C#设计模式--装饰器模式

8.C#设计模式--代理模式

9.C#设计模式--外观模式

10.C#设计模式--桥接模式

设计模式:

观察者模式(Observer Pattern)

简单介绍:

  观察者模式(Observer Pattern)是设计模式中行为模式的一种,它解决了上述具有一对多依赖关系的对象的重用问题。此模式的参与者分为两大类,一类是被观察的目标,另一类是观察该目标的观察者们。正因为该模式是基于“一对多”的关系,所以该模式一般是应用于由一个目标对象和N个观察者对象组成(当然也可以扩展为有多个目标对象,但我们现在只讨论前者)的场合。当目标对象的状态发生改变或做出某种行为时,正在观察该目标对象的观察者们将自动地、连锁地作出相应的响应行为。

模式中具有的角色

  1. 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
  2. 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
  3. 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  4. 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

举例子:博客的例子就是一个观察者模式,比如你关注一些作者的博客,当作者有博客发布时候,你就会收到一条该作者发布的博客的消息。

抽象主题:Blog 博客

具体主题:MyBlog   的博客

抽象观察者:IObserver

具体的观察者:Observer

观察者模式类图:

观察者模式C#代码举例

订阅博客抽象类

 /*****************************************************
* ProjectName: _11DesignPattern_Observer
* Description:
* ClassName: Blog
* CLRVersion: 4.0.30319.18408
* Author: JiYF
* NameSpace: _11DesignPattern_Observer
* MachineName: JIYONGFEI
* CreateTime: 2017/5/23 17:08:10
* UpdatedTime: 2017/5/23 17:08:10
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_Observer
{
/// <summary>
/// 订阅博客抽象类
/// </summary>
public abstract class Blog
{
/// <summary>
/// 保存订阅者列表
/// </summary>
private List<IObserver> observers = new List<IObserver>(); /// <summary>
/// 博主名
/// </summary>
public string BlogName { get; set; } /// <summary>
/// 博客标题
/// </summary>
public string BlogTitle { get; set; } /// <summary>
/// 博客信息
/// </summary>
public string BlogInfo { get; set; } /// <summary>
/// 博客构造函数
/// </summary>
/// <param name="blogTitle">博客标题</param>
/// <param name="blogInfo">博客信息</param>
public Blog(string name,string blogTitle,string blogInfo)
{
this.BlogName = name;
this.BlogTitle = blogTitle;
this.BlogInfo = blogInfo;
} /// <summary>
/// 添加一个订阅者
/// </summary>
/// <param name="observer">具体的订阅者对象</param>
public void AddObserver(IObserver observer)
{
if (observers.Contains(observer))
{
return;
}
observers.Add(observer);
} /// <summary>
/// 删除一个订阅者
/// </summary>
/// <param name="observer">具体的订阅者对象</param>
public void RemoveObserver(IObserver observer)
{
if (observers.Contains(observer))
{
observers.Remove(observer);
}
} /// <summary>
/// 发布博客通知
/// </summary>
public void PublishBlog()
{
//遍历通知每一个订阅者
foreach (IObserver ob in observers)
{
if (ob != null)
{
ob.Receive(this);
}
}
} }
}

具体的博客类

 /*****************************************************
* ProjectName: _11DesignPattern_Observer
* Description:
* ClassName: JiYFBlog
* CLRVersion: 4.0.30319.18408
* Author: JiYF
* NameSpace: _11DesignPattern_Observer
* MachineName: JIYONGFEI
* CreateTime: 2017/5/23 17:21:23
* UpdatedTime: 2017/5/23 17:21:23
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_Observer
{ /// <summary>
/// 具体的订阅博客类
/// </summary>
public class JiYFBlog :Blog
{
public JiYFBlog(string name,string blogTitile, string blogInfo)
: base(name,blogTitile,blogInfo)
{ }
}
}

订阅者接口类

 /*****************************************************
* ProjectName: _11DesignPattern_Observer
* Description:
* ClassName: IObserver
* CLRVersion: 4.0.30319.18408
* Author: JiYF
* NameSpace: _11DesignPattern_Observer
* MachineName: JIYONGFEI
* CreateTime: 2017/5/23 17:09:28
* UpdatedTime: 2017/5/23 17:09:28
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_Observer
{
/// <summary>
/// 订阅者接口
/// </summary>
public interface IObserver
{ void Receive(Blog blog);
}
}

具体的订阅者类:

 /*****************************************************
* ProjectName: _11DesignPattern_Observer
* Description:
* ClassName: Observer
* CLRVersion: 4.0.30319.18408
* Author: JiYF
* NameSpace: _11DesignPattern_Observer
* MachineName: JIYONGFEI
* CreateTime: 2017/5/23 17:23:36
* UpdatedTime: 2017/5/23 17:23:36
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_Observer
{
/// <summary>
/// 具体的订阅者类
/// </summary>
public class Observer :IObserver
{
/// <summary>
/// 订阅者名字
/// </summary>
private string m_Name;
public string Name
{
get { return m_Name; }
set { m_Name = value; }
} /// <summary>
/// 订阅者构造函数
/// </summary>
/// <param name="name">订阅者名字</param>
public Observer(string name)
{
this.m_Name = name;
} /// <summary>
/// 订阅者接受函数
/// </summary>
/// <param name="blog"></param>
public void Receive(Blog blog)
{
Console.WriteLine("订阅者:\"{0}\"观察到了:{1}发布的一篇博客,标题为:{2},内容为:{3}",Name,blog.BlogName,blog.BlogTitle,blog.BlogInfo);
}
}
}

测试代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_Observer
{
class Client
{
static void Main(string[] args)
{
Console.WriteLine("--全部订阅者--");
//创建一个JiYF的博客
Blog jiyfBlog = new JiYFBlog("JiYF笨小孩","丑小鸭","丑小鸭的故事"); //创建订阅者
Observer obsZhangsan = new Observer("张三");
Observer obsLiSi = new Observer("李四");
Observer obsWangwu = new Observer("王五"); //添加对JiYF博客的订阅者
jiyfBlog.AddObserver(obsZhangsan);
jiyfBlog.AddObserver(obsLiSi);
jiyfBlog.AddObserver(obsWangwu); //通知订阅者
jiyfBlog.PublishBlog(); Console.WriteLine("--移除订阅者张三--");
jiyfBlog.RemoveObserver(obsZhangsan);
jiyfBlog.PublishBlog();
Console.ReadLine();
}
}
}

运行结果:

通常在C#代码中,观察者模式一般采用委托来实现如下所示

委托实现观察者模式

抽象博客类:

 /*****************************************************
* ProjectName: _11DesignPattern_ObserverDelegateTest
* Description:
* ClassName: Blog
* CLRVersion: 4.0.30319.42000
* Author: JiYF
* NameSpace: _11DesignPattern_ObserverDelegateTest
* MachineName: JIYF_PC
* CreateTime: 2017/5/23 20:48:00
* UpdatedTime: 2017/5/23 20:48:00
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_ObserverDelegateTest
{
/// <summary>
/// 委托充当订阅者接口类
/// </summary>
/// <param name="sender"></param>
public delegate void NotifyEventHandler(object sender); /// <summary>
/// 订阅博客基类
/// </summary>
public class Blog
{
public NotifyEventHandler NotifyEvent;
/// <summary>
/// 博主名
/// </summary>
public string BlogName { get; set; } /// <summary>
/// 博客标题
/// </summary>
public string BlogTitle { get; set; } /// <summary>
/// 博客信息
/// </summary>
public string BlogInfo { get; set; } /// <summary>
/// 博客构造函数
/// </summary>
/// <param name="blogTitle">博客标题</param>
/// <param name="blogInfo">博客信息</param>
public Blog(string name, string blogTitle, string blogInfo)
{
this.BlogName = name;
this.BlogTitle = blogTitle;
this.BlogInfo = blogInfo;
} /// <summary>
/// 绑定订阅事件
/// </summary>
/// <param name="ob">订阅者</param>
public void AddObserver(NotifyEventHandler observer)
{
NotifyEvent += observer;
} /// <summary>
/// 取消绑定订阅
/// </summary>
/// <param name="observer"></param>
public void RemoteObserver(NotifyEventHandler observer)
{
NotifyEvent -= observer;
} /// <summary>
/// 发布博客通知
/// </summary>
public void PublishBlog()
{
if(NotifyEvent != null)
{
NotifyEvent(this);
}
}
}
}

具体的博客类

 /*****************************************************
* ProjectName: _11DesignPattern_ObserverDelegateTest
* Description:
* ClassName: JiYFBlog
* CLRVersion: 4.0.30319.42000
* Author: JiYF
* NameSpace: _11DesignPattern_ObserverDelegateTest
* MachineName: JIYF_PC
* CreateTime: 2017/5/23 20:55:58
* UpdatedTime: 2017/5/23 20:55:58
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_ObserverDelegateTest
{
/// <summary>
/// 具体的订阅博客类
/// </summary>
public class JiYFBlog : Blog
{
public JiYFBlog(string name, string blogTitile, string blogInfo)
: base(name, blogTitile, blogInfo)
{ }
}
}

订阅者类

 /*****************************************************
* ProjectName: _11DesignPattern_ObserverDelegateTest
* Description:
* ClassName: Observer
* CLRVersion: 4.0.30319.42000
* Author: JiYF
* NameSpace: _11DesignPattern_ObserverDelegateTest
* MachineName: JIYF_PC
* CreateTime: 2017/5/23 20:56:50
* UpdatedTime: 2017/5/23 20:56:50
*****************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_ObserverDelegateTest
{
/// <summary>
/// 具体的订阅者类
/// </summary>
public class Observer
{
/// <summary>
/// 订阅者名字
/// </summary>
private string m_Name;
public string Name
{
get { return m_Name; }
set { m_Name = value; }
} /// <summary>
/// 订阅者构造函数
/// </summary>
/// <param name="name">订阅者名字</param>
public Observer(string name)
{
this.m_Name = name;
} /// <summary>
/// 订阅者接受函数
/// </summary>
/// <param name="blog"></param>
public void Receive(object obj)
{
Blog blog = obj as Blog;
if (blog != null)
{
Console.WriteLine("订阅者:\"{0}\"观察到了:{1}发布的一篇博客,标题为:{2},内容为:{3}", Name, blog.BlogName, blog.BlogTitle, blog.BlogInfo);
}
}
}
}

测试代码

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace _11DesignPattern_ObserverDelegateTest
{
class Client
{
static void Main(string[] args)
{
Console.WriteLine("--全部订阅者--");
//创建一个JiYF的博客
Blog jiyfBlog = new Blog("JiYF笨小孩","丑小鸭","丑小鸭的故事"); //创建订阅者
Observer obsZhangsan = new Observer("张三");
Observer obsLiSi = new Observer("李四");
Observer obsWangwu = new Observer("王五"); //添加对JiYF博客的订阅者
jiyfBlog.AddObserver(new NotifyEventHandler(obsZhangsan.Receive));
jiyfBlog.AddObserver(new NotifyEventHandler(obsLiSi.Receive));
jiyfBlog.AddObserver(new NotifyEventHandler(obsWangwu.Receive)); ////通知订阅者
jiyfBlog.PublishBlog(); Console.WriteLine("---移除订阅者张三--");
jiyfBlog.RemoteObserver(new NotifyEventHandler(obsZhangsan.Receive));
jiyfBlog.PublishBlog();
Console.ReadLine();
}
}
}

运行结果:

源代码工程文件下载

C#设计模式--观察者模式(发布-订阅模式)的更多相关文章

  1. 设计模式 | 观察者模式/发布-订阅模式(observer/publish-subscribe)

    定义: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 结构:(书中图,侵删) 一个抽象的观察者接口, ...

  2. [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  3. C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

    使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...

  4. JavaScript设计模式(发布订阅模式)

    发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...

  5. SpringBoot事件监听机制及观察者模式/发布订阅模式

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

  6. javaScript设计模式:发布订阅模式

    发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...

  7. js设计模式之发布/订阅模式模式

    一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...

  8. 浅谈js设计模式之发布 — 订阅模式

    发布 — 订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScript开发中,我们一般用事件模型来替代传统的发布 — ...

  9. Javascript设计模式之发布-订阅模式

    简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...

  10. javascript中的设计模式之发布-订阅模式

    一.定义 又叫观察者模式,他定义对象间的依照那个一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将的到通知.在javascript中,我们一般用时间模型来替代传统的发布-订阅模式 二 ...

随机推荐

  1. reveal 使用注意事项

    **将libReveal.dylib 和 Reveal.framework 继承进项目后,一定要在 Build Phases->Link Binary With Libraries中将二者删除. ...

  2. Java代码常见的十种错误

    每一个程序员在编写代码的过程中都免不了出现错误或是小的失误,这些小的错误和失误往往使得程序员还得返工.那么,如何才能尽量避免这些错误的发生呢?笔者总结只有在日常的编写代码中总结出经验,在这篇文章中,笔 ...

  3. 一篇文章让你学透Linux系统中的more命令

    Linux 下有很多实用工具可以让你在终端界面查看文本文件.其中一个就是 more. more 跟我之前另一篇文章里写到的工具 —— less 很相似.它们之间的主要不同点在于 more 只允许你向前 ...

  4. Effective C++ 条款46

    本节条款:须要类型转换时请为模板定义非成员函数 这节知识是在条款24的基础上,讲述的有关非成员函数在模板类中(non-member function template)的作用. 我们先看一下条款24讲 ...

  5. 【ShoppingPeeker】-基于Webkit内核的爬虫蜘蛛引擎 ShoppingWebCrawler的姊妹篇-可视化任务Web管理

    ShoppingPeeker 这个项目是蜘蛛项目的可视化任务站点. 项目github地址:ShoppingPeeker 开发语言:C# 开发工具:Visual Studio 2017 +.Net Co ...

  6. Hadoop2.2.0分布式安装配置详解[2/3]

    前言 本文主要通过对hadoop2.2.0集群配置的过程加以梳理,所有的步骤都是通过自己实际测试.文档的结构也是根据自己的实际情况而定,同时也会加入自己在实际过程遇到的问题.搭建环境过程不重要,重要点 ...

  7. 有关Linux下request.getRealPath("/")获取路径的问题

    request.getRealPath("/") 在window获取的是服务器的根目录,结尾包含分隔符, 如E:\apache-tomcat-6.0.29-bak\apache-t ...

  8. React Native for Android应用名及图标修改

    应用开发完了,总不能顶着MyProject和小机器人图标就发布了吧?在发布之前,有多处需要修改的地方.今天我们来全面的看一下 应用ID 俗称PackageName,或APP ID.注意,在gradle ...

  9. Communications link failure due to underlying exception异常处理(转)

    最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql.开发测试没有问题,在运行中每个一段长的空闲时间就出现异常: java 代码 org.hibernate.exception. ...

  10. C# ToShortDateString() ToString() 设置日期格式的区别

    在C#中,ToShortDateString()是用于显示短日期格式的方法,如果使用下面的语句: Label1.Text = DateTime.Now.ToShortDateString(); 那么, ...