我们用一个例子来实现观察者模式
发布新闻的时候,我们每一个订阅新闻发布会的人都会看到新闻内容的更新
①定义一个接口,所有的订阅者都要遵循该接口,这样在新闻发生变化的时候,订阅者就能及时收到新闻内容的变化(接口强制实现)
public interface INewsSubscriber
{void update(string news);
}
②定义几个订阅者,要强制实现接口
public class Newspaper : INewsSubscriber
{public void Update(string news){Console.WriteLine($"Newspaper received news: {news}");}
}public class RadioStation : INewsSubscriber
{public void Update(string news){Console.WriteLine($"Radio Station received news: {news}");}
}
③定义新闻的发布者,他知道有哪些人订阅了新闻,所以就要有添加订阅者、移除订阅者、通知订阅者、发布新闻的功能
#创建一个存储接口的列表,当一个类实现了该接口,就可以直接通过列表.add(该类)来添加该类
public class NewsPublisher
{//存储所有的订阅者private List<INewsSubscriber> subscribers = new List<INewsSubscriber>();//添加订阅者public void Subscribe(INewsSubscriber subscriber){subscribers.Add(subscriber);}//移除订阅者public void Unsubscribe(INewsSubscriber subscriber){subscribers.Remove(subscriber);}//通知订阅者public void Notify(string news){foreach (var subscriber in subscribers){subscriber.Update(news);}}//发布新闻public void PublishNews(string news){Console.WriteLine($"Publishing news: {news}");Notify(news);}
}
④具体实现
创建一个新闻发布媒体→创建几个订阅商→订阅商订阅→媒体发布新闻
public class Program
{public static void Main(){NewsPublisher publisher = new NewsPublisher();Newspaper newspaper = new Newspaper();RadioStation radioStation = new RadioStation();publisher.Subscribe(newspaper);publisher.Subscribe(radioStation);publisher.PublishNews("Breaking News: New programming language released!"); publisher.PublishNews("Weather Alert: Heavy rain expected tomorrow.");}
}
控制台运行的结果是:
Publishing news: Breaking News: New programming language released!
Newspaper received news: Breaking News: New programming language released!
Radio Station received news: Breaking News: New programming language released!Publishing news: Weather Alert: Heavy rain expected tomorrow.
Newspaper received news: Weather Alert: Heavy rain expected tomorrow.
Radio Station received news: Weather Alert: Heavy rain expected tomorrow.