DesignPattern - Observer
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
//在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”
//——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
//如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
//意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
//以下是推模式
public partial class DesignPattern_Observer : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Iobserver c = new Company("光华数码");
Iobserver h = new Home("BT小区");
Restaurant r = new Restaurant("成都小吃");
People p = new People("陈大雄", r);
r.n += new Notice(h.PriceChange);//模式无关
r.n += new Notice(c.PriceChange);//模式无关
r.ListObserver.Add(c);
r.ListObserver.Add(h);
r.ListObserver.Add(p);
r.SendMessage();
r.n.Invoke("菜价变了<br>");
}
}
//通知接口
public interface Iobserver
{
void PriceChange(string Content);
}
//被通知对象1
public class Company : Iobserver
{
private string _CompanyName;
public Company(string CompanyName)
{
_CompanyName = CompanyName;
}
public void PriceChange(string Content)
{
HttpContext.Current.Response.Write(_CompanyName + "收到" + Content);
}
}
//被通知对象2
public class Home : Iobserver
{
private string HomeName;
public Home(string HomeName)
{
this.HomeName = HomeName;
}
public void PriceChange(string Content)
{
HttpContext.Current.Response.Write(HomeName + "知道了" + Content);
}
}
public abstract class FoodProvide
{
public List<Iobserver> ListObserver = new List<Iobserver>();
public virtual void SendMessage()
{
}
}
//通知者1
public class Restaurant : FoodProvide
{
private string RestaurantName;
public Restaurant(string RestaurantName)
{
this.RestaurantName = RestaurantName;
}
public override void SendMessage()
{
foreach (Iobserver observer in ListObserver)
{
observer.PriceChange(RestaurantName + "的鱼香肉丝涨价了<br>");
}
}
public Notice n;//委托漂亮的实现
}
public delegate void Notice(string Content);//委托实现,与此模式无关
//拉模式核心:
public class People : Iobserver
{
private string PeopleName;
private FoodProvide foodProvide;
public People(string PeopleName, FoodProvide F)
{
this.PeopleName = PeopleName;
foodProvide= F;
}
public void PriceChange(string Content)
{
HttpContext.Current.Response.Write(PeopleName + "收到" + foodProvide.ToString()+"的价格变动通知,并可以自己查看是哪个变了<br>");//未写全
}
}