行为型模式-观察者模式

using System;
using System.Text;
using System.Collections.Generic;


namespace 观察者模式
{
/*
* 观察者模式意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
* 观察者模式实现要点:1、需要在状态对象通知者建立容器,管理被通知对象
* 2、实现对容器进行管理
* 3、实现核心的更新方法
*
* 观察者模式优点:1、使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
* 2、目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
* 3、在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
*
* 观察者模式适用性:1、一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
* 2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
* 3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
*/




///<summary>
/// 主题或者抽象通知者,管理所需要的通知(观察的)对象
///</summary>
publicabstractclass Subject
{
private IList<Observer> observers=new List<Observer>();


///<summary>
/// 添加观察对象
///</summary>
///<param name="observer"></param>
publicvoid Attach(Observer observer)
{
observers.Add(observer);
}

///<summary>
/// 移除观察对象
///</summary>
///<param name="observer"></param>
publicvoid Dettach(Observer observer)
{
observers.Remove(observer);
}

///<summary>
/// 观察者模式核心方法,负责更改具体需要通知的对象
///</summary>
publicvoid Notify()
{
foreach (Observer o in observers)
{

o.Update();
}
}
}

///<summary>
/// 需要通知的对象抽象类,为需要通知的对象抽象公共的更新方法
///</summary>
publicabstractclass Observer
{
publicabstractvoid Update();
}

///<summary>
/// 具体通知者,通知其状态发生变化
///</summary>
publicclass ConcreteSubject : Subject
{
privatestring _subjectState;

publicstring SubjectState
{
get { return _subjectState; }
set { _subjectState = value; }
}
}
///<summary>
/// 具体的被通知的对象
///</summary>
publicclass ConcreteObserver : Observer
{
privatestring name;
///<summary>
/// 具体的对象状态
///</summary>
privatestring observerState;

///<summary>
/// 依赖的具体对象
///</summary>
private ConcreteSubject subject;

public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}



///<summary>
/// 根据其依赖的对象来构造
///</summary>
///<param name="subject">所要依赖的通知者具体对象</param>
///<param name="name"></param>
public ConcreteObserver(ConcreteSubject subject,string name)
{
this.Subject = subject;
this.name = name;
}
///<summary>
/// 具体更新方法
///</summary>
publicoverridevoid Update()
{
observerState
= subject.SubjectState;
}
}

///<summary>
/// 客户调用
///</summary>
publicclass ClientApp
{
publicstaticvoid Main(string[] args)
{
ConcreteSubject subject
=new ConcreteSubject();
subject.Attach(
new ConcreteObserver(subject,"observer1"));
subject.Attach(
new ConcreteObserver(subject,"observer2"));

subject.SubjectState
="subject change it's state!";
subject.Notify();
}

}
}
using System;
using System.Text;
using System.Collections.Generic;


namespace 观察者模式
{
    /*
     * 观察者模式意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
     * 观察者模式实现要点:1、需要在状态对象通知者建立容器,管理被通知对象
     *                     2、实现对容器进行管理
     *                     3、实现核心的更新方法
     *                    
     * 观察者模式优点:1、使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
     *                 2、目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
     *                 3、在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
     *              
     * 观察者模式适用性:1、一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
     *                   2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
     *                   3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
     */




    /// <summary>
    /// 主题或者抽象通知者,管理所需要的通知(观察的)对象
    /// </summary>
    public abstract class Subject
    {
        private IList<Observer> observers=new List<Observer>();
      

        /// <summary>
        /// 添加观察对象
        /// </summary>
        /// <param name="observer"></param>
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        /// <summary>
        /// 移除观察对象
        /// </summary>
        /// <param name="observer"></param>
        public void Dettach(Observer observer)
        {
            observers.Remove(observer);
        }

        /// <summary>
        /// 观察者模式核心方法,负责更改具体需要通知的对象
        /// </summary>
        public void Notify()
        {
            foreach (Observer  o in observers)
            {

                o.Update();
            }
        }
    }
 
    /// <summary>
    /// 需要通知的对象抽象类,为需要通知的对象抽象公共的更新方法
    /// </summary>
    public abstract class Observer
    {
        public abstract void Update();
    }

    /// <summary>
    /// 具体通知者,通知其状态发生变化
    /// </summary>
    public class ConcreteSubject : Subject
    {
        private string _subjectState;

        public string SubjectState
        {
            get { return _subjectState; }
            set { _subjectState = value; }
        }
    }
    /// <summary>
    /// 具体的被通知的对象
    /// </summary>
    public class ConcreteObserver : Observer
    {
        private string name;
        /// <summary>
        /// 具体的对象状态
        /// </summary>
        private string observerState;

        /// <summary>
        /// 依赖的具体对象
        /// </summary>
        private ConcreteSubject subject;

        public ConcreteSubject Subject
        {
            get { return subject; }
            set { subject = value; }
        }
     


        /// <summary>
        /// 根据其依赖的对象来构造
        /// </summary>
        /// <param name="subject">所要依赖的通知者具体对象</param>
        /// <param name="name"></param>
        public ConcreteObserver(ConcreteSubject subject,string name)
        {
            this.Subject = subject;
            this.name = name;
        }
      /// <summary>
      /// 具体更新方法
      /// </summary>
        public override void Update()
        {
            observerState = subject.SubjectState;
        }
    }

    /// <summary>
    /// 客户调用
    /// </summary>
    public class ClientApp
    {
        public static void Main(string[] args)
        {
            ConcreteSubject subject = new ConcreteSubject();
            subject.Attach(new ConcreteObserver(subject,"observer1"));
            subject.Attach(new ConcreteObserver(subject,"observer2"));

            subject.SubjectState="subject change it's state!";
            subject.Notify();
        }
       
    }
}
using System;
using System.Text;
using System.Collections.Generic;


namespace 观察者模式
{
/*
* 观察者模式意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
* 观察者模式实现要点:1、需要在状态对象通知者建立容器,管理被通知对象
* 2、实现对容器进行管理
* 3、实现核心的更新方法
*
* 观察者模式优点:1、使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
* 2、目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知。目标对象对此一无所知。
* 3、在C#中的Event。委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
*
* 观察者模式适用性:1、一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
* 2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
* 3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
*/




///<summary>
/// 主题或者抽象通知者,管理所需要的通知(观察的)对象
///</summary>
publicabstractclass Subject
{
private IList<Observer> observers=new List<Observer>();


///<summary>
/// 添加观察对象
///</summary>
///<param name="observer"></param>
publicvoid Attach(Observer observer)
{
observers.Add(observer);
}

///<summary>
/// 移除观察对象
///</summary>
///<param name="observer"></param>
publicvoid Dettach(Observer observer)
{
observers.Remove(observer);
}

///<summary>
/// 观察者模式核心方法,负责更改具体需要通知的对象
///</summary>
publicvoid Notify()
{
foreach (Observer o in observers)
{

o.Update();
}
}
}

///<summary>
/// 需要通知的对象抽象类,为需要通知的对象抽象公共的更新方法
///</summary>
publicabstractclass Observer
{
publicabstractvoid Update();
}

///<summary>
/// 具体通知者,通知其状态发生变化
///</summary>
publicclass ConcreteSubject : Subject
{
privatestring _subjectState;

publicstring SubjectState
{
get { return _subjectState; }
set { _subjectState = value; }
}
}
///<summary>
/// 具体的被通知的对象
///</summary>
publicclass ConcreteObserver : Observer
{
privatestring name;
///<summary>
/// 具体的对象状态
///</summary>
privatestring observerState;

///<summary>
/// 依赖的具体对象
///</summary>
private ConcreteSubject subject;

public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}



///<summary>
/// 根据其依赖的对象来构造
///</summary>
///<param name="subject">所要依赖的通知者具体对象</param>
///<param name="name"></param>
public ConcreteObserver(ConcreteSubject subject,string name)
{
this.Subject = subject;
this.name = name;
}
///<summary>
/// 具体更新方法
///</summary>
publicoverridevoid Update()
{
observerState
= subject.SubjectState;
}
}

///<summary>
/// 客户调用
///</summary>
publicclass ClientApp
{
publicstaticvoid Main(string[] args)
{
ConcreteSubject subject
=new ConcreteSubject();
subject.Attach(
new ConcreteObserver(subject,"observer1"));
subject.Attach(
new ConcreteObserver(subject,"observer2"));

subject.SubjectState
="subject change it's state!";
subject.Notify();
}

}
}
posted @ 2011-03-22 22:35  日月之明  阅读(299)  评论(0编辑  收藏  举报