行为模式之七---Observer

1、结构图

Observer结构图

2.代码

 

 

/**********************************************************
 * 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 
 *     所有依赖于它的对象都得到通知并被自动更新。
 * 适用性:
 * 1、当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者
 *    封装在独立的对象中以使它们可以各自独立地改变和复用。 
 * 2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象
 *    有待改变。 
 * 3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,
 *    你不希望这些对象是紧密耦合的。 
 *    
 * 协作:
 * 1、当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致
 *    的改变时,它将通知它的各个观察者。
 * 2、在得到一个具体目标的改变的通知后,ConcreteObserver对象可向
 *    目标对象查询信息。
 * 3、注意发出改变请求的Observer对象并不立即更新,而是将其推迟到它从一个
 *   目标得到一个通知之后。Notify不总是由目标对象调用。它也可被一个观察
 *   者或其他对象调用。   
 * 作者:董怀信
 * 日期:2009-06-09
 * *******************************************************/
using System;
using System.Collections.Generic;
 
namespace DesignPattern.BehavioralPattern
{
    /// <summary>
    /// 为那些在目标发生改变时需获得通知的对象定义一个更新接口。
    /// </summary>
    public abstract class Observer
    {
        public abstract void Update();
    }
 
    /// <summary>
    /// 目标知道它的观察者。可以有任何多个观察者观察同一个目标。
    /// 提供注册和删除观察者对象的接口。
    /// </summary>
    public abstract class Subject
    {
        protected List<Observer> m_observerList;
        public Subject()
        {
            m_observerList = new List<Observer>();
        }
        public void Attach(Observer observer)
        {
            m_observerList.Add(observer);
        }
 
        public void Detach(Observer observer)
        {
            m_observerList.Remove(observer);
        }
 
        public void Notify()
        {
            foreach (Observer item in m_observerList)
            {
                item.Update();
            }
        }
 
    }
 
    /// <summary>
    /// 将有关状态存入各ConcreteObserver对象。
    /// 当它的状态发生改变时,向它的各个观察者发出通知。
    /// </summary>
    public class ConcreteSubject : Subject
    {
        private string m_subjectState;
 
        public void SetState(string state)
        {
            m_subjectState = state;
            Console.WriteLine(" The State Of ConcreteSubject:" + m_subjectState);
        }
 
        public string GetState()
        {
            return m_subjectState;
        }
    }
 
    /// <summary>
    /// 维护一个指向ConcreteSubject对象的引用。
    /// 存储有关状态,这些状态应与目标的状态保持一致。
    /// 事项Observer的更新接口以使自身状态与目标的状态保持一致。
    /// </summary>
    public class ConcreteObserver : Observer
    {
        private string m_observerState;
        private ConcreteSubject m_subject;
        public ConcreteObserver(ConcreteSubject subject)
        {
            m_subject = subject;
 
        }
        public override void Update()
        {
            m_observerState = m_subject.GetState();
            Console.WriteLine("The State Of ConcreteObserver:" + m_observerState);
        }
    }
 
    /// <summary>
    /// 客户测试
    /// </summary>
    public class Client
    {
        public void Test()
        {
 
            ConcreteSubject subject = new ConcreteSubject();
            ConcreteObserver observer = new ConcreteObserver(subject);
            subject.Attach(observer);
 
            subject.SetState("A");
            subject.Notify();
        }
    }
 
}
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalsonTung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值