设为首页 加入收藏

TOP

设计模式 - 观察者模式(二)
2017-10-13 10:40:48 】 浏览:6428
Tags:设计模式 观察者 模式
/// </summary> public abstract class Subject { private List<Observer> observers = new List<Observer>(); public void Register(Observer ob) { observers.Add(ob); Console.WriteLine(ob.Name + " 订阅成功!"); } public void Remove(Observer ob) { observers.Remove(ob); Console.WriteLine(ob.Name + " 取消订阅!"); } /// <summary> /// 通知所有已注册的观察者对象 /// </summary> public void Notify() { foreach (var item in observers) { item.Read(this); } } } /// <summary> /// 具体主题类 -- 今日头条 /// </summary> public class ConcreteSubject : Subject { public string News { get; set; } private string category; public void Publish(string news, string category) { this.News = news; this.category = category; Console.WriteLine("推送新闻({0}):{1}", this.category, this.News); this.Notify(); } public string GetCategory() { return this.category; } }

客户端:

var ob1 = new ConcreteObserver() { Name = "高俅", Likes = new List<string>() { "八卦" } };
var ob2 = new ConcreteObserver() { Name = "小小", Likes = new List<string>() { "科技" } };
var ob3 = new ConcreteObserver() { Name = "林三", Likes = new List<string>() { "汽车" } };

ConcreteSubject sub = new ConcreteSubject() { };
sub.Register(ob1);
sub.Register(ob2);
sub.Register(ob3);
Console.WriteLine("--------------------------------");

sub.Publish("最近好多明星结婚啦!", "八卦");
Console.WriteLine("--------------------------------");

sub.Publish("华为研发出新电池!", "科技");
Console.WriteLine("--------------------------------");

sub.Remove(ob2);
Console.WriteLine("--------------------------------");

sub.Publish("众泰出保时捷款了!", "汽车");

Console.ReadKey();

结果:

 

三、事件实现推模式

看Subject类, 是否有些熟悉的赶脚, 好像事件内部的封装方式.

只需要修改一下主题类就好, 观察者可以不做修改

public delegate void Read(string news);

/// <summary>
/// 具体主题类 -- 今日头条
/// </summary>
public class ConcreteSubject
{
    public event Read Reads;

    public string News { get; set; }

    public void Publish(string news)
    {
        this.News = news;
        Console.WriteLine("推送主题新闻为:" + this.News);
        Reads(news);
    }
}

客户端:

var ob1 = new ConcreteObserver() { Name = "高俅" };
var ob2 = new ConcreteObserver() { Name = "小小" };
var ob3 = new ConcreteObserver() { Name = "林三" };

ConcreteSubject sub = new ConcreteSubject() { };
sub.Reads += ob1.Read;
sub.Reads += ob2.Read;
sub.Reads += ob3.Read;

sub.Publish("最近好多明星结婚啦!");
Console.WriteLine("--------------------------------");

sub.Reads -= ob2.Read;

sub.Publish("众泰出保时捷款了!");

Console.ReadKey();

结果:

 

四、事件实现拉模式

public delegate void Read(ConcreteSubject subject);

public class Subject{ }

/// <summary>
/// 具体主题类 -- 今日头条
/// </summary>
public class ConcreteSubject : Subject
{
    public event Read Reads;

    public string News { get; set; }

    private string category;

    public void Publish(string news, string category)
    {
        this.News = news;
        this.category = category;
        Console.WriteLine("推送新闻({0}):{1}", this.category, this.News);
        Reads(this);
    }

    public string GetCategory()
    {
        return this.category;
    }
}

这里我保留了Subject类, 这样, 观察者那

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式 - 单例模式 下一篇Lind.DDD.Aspects通过Plugins实现..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目