五分钟一个设计模式,用最简单的方法来描述设计模式。
观察者模式的定义是:定义对象间的一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新
我们用报社和读者之间的关系来模拟观察者模式。
包含以下主体:
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的属性被修改,就会自动通知所有读者!
原文地址:http://blog.csdn.net/daguanjia11/article/details/46003131