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

 


 

转载于:https://www.cnblogs.com/bearyx/archive/2008/10/20/1315092.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值