码迷,mamicode.com
首页 > 其他好文 > 详细

五分钟一个设计模式之观察者模式

时间:2015-05-26 09:16:36      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:观察者模式   observer   设计模式   

五分钟一个设计模式,用最简单的方法来描述设计模式。

认识观察者模式

观察者模式的定义是:定义对象间的一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新

报社跟读者的例子

我们用报社和读者之间的关系来模拟观察者模式。
包含以下主体:

  1. 报社(NewspaperOffice)
  2. 读者接口(Reader)
  3. 具体读者(Reader_二逼青年、Reader_文艺青年)

Reader_二逼青年、Reader_文艺青年实现Reader接口,并订阅报纸,报社有新报纸时,会通知所有读者

示例代码

public class NewspaperOffice
{
    /// <summary>
    /// 用来保存所有订阅报纸的读者
    /// </summary>
    private List<Reader> readerList = new List<Reader>();

    /// <summary>
    /// 订阅报纸
    /// </summary>
    /// <param name="reader"></param>
    public void Subscribe(Reader reader)
    {
        if (!readerList.Contains(reader))
            readerList.Add(reader);
    }

    /// <summary>
    /// 退订报纸
    /// </summary>
    /// <param name="reader"></param>
    public void Unsubscribe(Reader reader)
    {
        readerList.Remove(reader);
    }

    public void SendNewspaper()
    {
        foreach (Reader reader in readerList)
        {
            reader.Receive(this);
        }
    }

    public string Title { get; set; }

    public string Content { get; set; }

}
public interface Reader
{
    /// <summary>
    /// 被动地接收报纸
    /// </summary>
    /// <param name="newspaper"></param>
    void Receive(NewspaperOffice newspaper);
}
class Reader_文艺青年:Reader
{
    public void Receive(NewspaperOffice newspaper)
    {
        Console.WriteLine("文艺青年收到了报纸");
        Console.WriteLine(newspaper.Title);
        Console.WriteLine(newspaper.Content);
    }
}
class Reader_二逼青年 : Reader
{
    public void Receive(NewspaperOffice newspaper)
    {
        Console.WriteLine("二逼青年收到了报纸");
        Console.WriteLine(newspaper.Title);
        Console.WriteLine(newspaper.Content);
    }
}

下面是场景类,来模拟这个订阅和通知的过程

class Program
{
    static void Main(string[] args)
    {
        NewspaperOffice newspaperOffice = new NewspaperOffice();

        Reader_二逼青年 reader_2b = new Reader_二逼青年();
        Reader_二逼青年 reader_2bplus = new Reader_二逼青年();
        Reader_文艺青年 reader_zhuangbi = new Reader_文艺青年();

        //订阅报纸
        newspaperOffice.Subscribe(reader_2b);
        newspaperOffice.Subscribe(reader_2bplus);
        newspaperOffice.Subscribe(reader_zhuangbi);

        //新报纸来了
        newspaperOffice.Title = "全国人民喜迎油价上涨";
        newspaperOffice.Content = "新华社报道,随着国际油价的波动,..................";
        //通知所有读者
        newspaperOffice.SendNewspaper();

        //这家伙退订了报纸
        newspaperOffice.Unsubscribe(reader_zhuangbi);

        //新报纸又来了
        newspaperOffice.Title = "全国人民再次喜迎油价上涨";
        newspaperOffice.Content = "新华社报道,随着国际油价的再次波动,..................";
        //通知所有读者
        newspaperOffice.SendNewspaper();
    }
}

运行结果:
二逼青年收到了报纸
全国人民喜迎油价上涨
新华社报道,随着国际油价的波动,………………
二逼青年收到了报纸
全国人民喜迎油价上涨
新华社报道,随着国际油价的波动,………………
文艺青年收到了报纸
全国人民喜迎油价上涨
新华社报道,随着国际油价的波动,………………
二逼青年收到了报纸
全国人民再次喜迎油价上涨
新华社报道,随着国际油价的再次波动,………………
二逼青年收到了报纸
全国人民再次喜迎油价上涨
新华社报道,随着国际油价的再次波动,………………

什么时候通知所有读者

上面的代码是主动调用了newspaperOffice.SendNewspaper();
也可以更加自动化,放在NewspaperOffice的Content属性的setter方法中调用

private string content;
public string Content
{
    get {
        return content;
    }
    set {
        content = value;
        SendNewspaper();
    }
}

这样子的话,只要Content的属性被修改,就会自动通知所有读者!

五分钟一个设计模式之观察者模式

标签:观察者模式   observer   设计模式   

原文地址:http://blog.csdn.net/daguanjia11/article/details/46003131

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!