观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。将观察者(watcher)和被观察者(subject)完美分离。

这里讲一个场景:话说赵丽颖小姐姐最近如日中天,受到很多粉丝喜爱,某天她开通了微博,迅速获得几千万粉丝关注。当然赵丽颖平常发发微博,她的”萤火虫“们收到她的微博的通知后会去评论和留言;当然也不乏有各种各样的喷子,她心情好可以不理这些人,过分的话,去你丫的,姐可以拉黑你!!!

下面就这个场景,我决定用观察者模式将之还原。

我们都知道观察者模式,有四个角色:抽象主题、具体主题、抽象观察者和具体观察者。

话不多说上代码:

AbstractBloger:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Observer
{
/// <summary>
/// 开通微博的博主们
/// </summary>
public abstract class AbstractBloger
{
/// <summary>
/// 粉丝列表
/// </summary>
private List<AbstractFan> fans = new List<AbstractFan>(); /// <summary>
/// 博主姓名
/// </summary>
public string BlogerName { get; set; } /// <summary>
/// 博主构造函数
/// </summary>
/// <param name="name">博主姓名</param>s
public AbstractBloger(string name)
{
this.BlogerName = name;
} /// <summary>
/// 添加一个订阅者(粉丝)
/// </summary>
/// <param name="observer">具体的订阅者(粉丝)对象</param>
public void AddObserver(AbstractFan observer)
{
if (fans.Contains(observer))
{
return;
}
fans.Add(observer);
Console.WriteLine($"{observer.name}关注了她");
} /// <summary>
/// 删除一个订阅者(粉丝)
/// </summary>
/// <param name="observer">具体的订阅者(粉丝)对象</param>
public void RemoveObserver(AbstractFan observer)
{
if (fans.Contains(observer))
{
fans.Remove(observer);
}
} /// <summary>
/// 博主发表微博,此时粉丝会收到通知
/// </summary>
public void PublishBlog()
{
Console.WriteLine($"{this.BlogerName}发表了一条微博");
//遍历通知每一个订阅者(粉丝)
foreach (AbstractFan ob in fans)
{
if (ob != null)
{
ob.Receive(this);
}
}
} }
}

Bloger:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Observer
{
/// <summary>
/// 具体的订阅博主类
/// </summary>
public class Bloger : AbstractBloger
{
public Bloger(string name)
: base(name)
{
Console.WriteLine($"{name}开通微博了");
}
}
}

AbstractFan:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Observer
{
/// <summary>
/// 关注博主的粉丝们
/// </summary>
public abstract class AbstractFan
{
public string name { get; set; }
public AbstractFan(string name)
{
this.name = name;
}
public abstract void Receive(AbstractBloger bloger);
}
}

Fan:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Observer
{
public class Fan:AbstractFan
{
/// <summary>
/// 观察者(粉丝)名字
/// </summary>
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
} /// <summary>
/// 观察者(粉丝)构造函数
/// </summary>
/// <param name="name">观察者(粉丝)名字</param>
public Fan(string name):base(name)
{
this._Name = name;
} /// <summary>
/// 观察
/// </summary>
/// <param name="blog"></param>
public override void Receive(AbstractBloger bloger)
{
Console.WriteLine("{0}观察到了:{1}发布了一条微博", Name, bloger.BlogerName);
}
}
}

测试程序Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Observer; namespace ObserverTest
{
class Program
{
static void Main(string[] args)
{
//赵丽颖某天开通了微博
AbstractBloger bloger = new Bloger("赵丽颖");
//创建订阅者
AbstractFan me = new Fan("铁粉");
AbstractFan penzi = new Fan("喷子粉");
AbstractFan jiangshi = new Fan("僵尸粉");
Console.WriteLine("有很多粉丝都关注了她");
//添加对赵丽颖的关注
bloger.AddObserver(me);
bloger.AddObserver(penzi);
bloger.AddObserver(jiangshi);
//赵丽颖发布一条微博
bloger.PublishBlog();
Console.WriteLine("有个喷子经常喷赵丽颖");
Console.WriteLine("赵丽颖一怒之下将此喷子拉黑");
bloger.RemoveObserver(penzi);
bloger.PublishBlog();
Console.ReadLine();
}
}
}

测试结果:

C#通熟易懂观察者模式的更多相关文章

  1. JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)

    作者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html,简书地址:http://www.jianshu.com/p/b963b3 ...

  2. EJB初识(通熟易懂)

    转载自http://blog.csdn.net/jojo52013145/article/details/5783677,讲的很透彻,佩服,膜拜学习 1. 我们不禁要问,什么是"服务集群&q ...

  3. stl的实现原理简单讲解,通熟易懂

    总结 需要经常随机访问请用vector 2.list list就是双向链表,元素也是在堆中存放,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存 ...

  4. 最通熟易懂的Hadoop HDFS实践攻略

    HDFS是用来解决什么问题?怎么解决的? 如何在命令行下操作HDFS? 如何使用Java API来操作HDFS? 在了解基本思路和操作方法后,进一步深究HDFS具体的读写数据流程 学习并实践本文教程后 ...

  5. 基于OpenCV的车辆检测与追踪的实现

    最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...

  6. (一)开篇—杂谈WebGIS

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 我相信大家对百度地图,谷歌地图等相关应用已经是非常熟悉了.通过 ...

  7. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  8. java IO基础操作

    java IO基础,通熟易懂,好久没复习java 基础了.这里是传送门... http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.ht ...

  9. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

随机推荐

  1. Linux - info

    基本上,info与man的用途其实差不多,都是用来查询命令的用法或者是文件的格式.但是与man page一口气输出一堆信息不同的是,info page则是将文件数据拆成一个一个的段落,每个段落用自己的 ...

  2. sqlserver2008中删除了windows用户,导致无法登陆的解决方案

    打开管理工具中的"服务",找到并关闭SQL Server服务.进入命令进入SQL Server 2008的安装目录,找到sqlservr.exe文件,执行命令:sqlservr - ...

  3. BT币(金融有风险,投资需谨慎)哥的失败投资

    谁都知道bt币是一个旁氏骗局, 而进去的人,就必须保证自己不赔钱,所以只能随着大潮往前走,谁也不能让它跌 压垮骆驼的最后一根稻草, 还是幕后有个 推手, 在炒作 BT币, 事实上,作为新的投资项目,B ...

  4. 如何修改linux开机运行配置脚本

    开机运行级别的配置角本 /etc/inittab 开机运行级别  init 是切换运行级别的指令 0.关机              //init0 1.单用户模式(自动获取超级用户权限,无网络,无服 ...

  5. ZooKeeper客户端事件串行化处理

    为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造.在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题, ...

  6. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  7. 掌握 Java 泛型类型(一)

    为理解泛型类型为何如此有用,我们要将注意力转向 Java 语言中最容易引发错误的因素之一 - 需要不断地将表达式向下类型转换(downcast)为比其静态类型更为具体的数据类型(请参阅参考资料中的&q ...

  8. 一个resin启动bug的解决

    这个bug的问题后来被确认为Resin所在目录层有中文目录名.--------------------------------------------------------------------- ...

  9. 简单剖析Node中的事件监听机制(一)

    使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...

  10. PHP基础(一)--字符串函数大盘点(基础篇)

    参考地址http://php.net/manual/zh/ref.strings.php addcslashes - 以 C 语言风格使用反斜线转义字符串中的字符    string addcslas ...