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>");//未写全
    }
}

 


 

posted @ 2008-10-20 14:45  游侠_1  阅读(152)  评论(0编辑  收藏  举报