C#通熟易懂观察者模式
观察者模式(有时又被称为模型-视图(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#通熟易懂观察者模式的更多相关文章
- JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)
作者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html,简书地址:http://www.jianshu.com/p/b963b3 ...
- EJB初识(通熟易懂)
转载自http://blog.csdn.net/jojo52013145/article/details/5783677,讲的很透彻,佩服,膜拜学习 1. 我们不禁要问,什么是"服务集群&q ...
- stl的实现原理简单讲解,通熟易懂
总结 需要经常随机访问请用vector 2.list list就是双向链表,元素也是在堆中存放,每个元素都是放在一块内存中,它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存 ...
- 最通熟易懂的Hadoop HDFS实践攻略
HDFS是用来解决什么问题?怎么解决的? 如何在命令行下操作HDFS? 如何使用Java API来操作HDFS? 在了解基本思路和操作方法后,进一步深究HDFS具体的读写数据流程 学习并实践本文教程后 ...
- 基于OpenCV的车辆检测与追踪的实现
最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...
- (一)开篇—杂谈WebGIS
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 我相信大家对百度地图,谷歌地图等相关应用已经是非常熟悉了.通过 ...
- Redis集群研究和实践(基于redis 3.0.5)
前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...
- java IO基础操作
java IO基础,通熟易懂,好久没复习java 基础了.这里是传送门... http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.ht ...
- IOS开发之多线程 -- GCD的方方面面
前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...
随机推荐
- 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
一 . 常量和变量 Swift语言 对常量和变量的声明进行了明确的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明确. 常量和变量的区别是常量在设置或初始化后 ...
- OpenCV——彩色图像转成灰度图像
// PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <iostr ...
- c++ list 合并操作函数实例
#include <list> #include <iostream> using namespace std; //list 链表的打印 void print(list< ...
- Oracle经常用到的一些函数
1.数字函数 NVL( string1, replace_with) :如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ...
- Course3-Python文件I/O
1. 读取键盘输入 Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: 1). raw_input. raw_input([prompt]) 函数从标准输入读取一个行, ...
- 鹅厂优文|打通小程序音视频和webRTC
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯视频云终端技术总监常青, 2008 年毕业加入腾讯,一直从事客户端研发相关工作,先后参与过 PC QQ.手机QQ.QQ物联 等产品 ...
- JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用
实现在FreeMarker模板中控制对应按钮的显示隐藏主要用到了Shiro中的hasRole, hasAnyRoles, hasPermission以及Authenticated等方法,我们可以实现T ...
- struts2.1.8+hibernate2.5.6+spring3.0(ssh2三大框架)常见异常原因和解决方案
---------------------------------------------------------------------------------------------------- ...
- Servlet 学习总结
Servlet资料整理[很全很强大] 分类: J2EE2009-10-23 00:51 671人阅读 评论(0) 收藏 举报 servletsessionstring服务器initialization ...
- GPU Accelerated Computing with Python
https://developer.nvidia.com/how-to-cuda-Python python is one of the fastest growing and most popula ...