zoukankan      html  css  js  c++  java
  • 观察者设计模式

    定义

    观察者设计模式:观察者设计模式中包含一对多的依赖关系,让多个观察者同时关注某一主题,当这个主题的某一状态发生变化,会通知所有观察着对象,使观察者能够自动更新自身。

    解决问题

    观察者设计模式主要是以一种简单易行的方法而又灵活的方式解决一对多的通知问题。

    角色

    抽象主题(abstractSubject):保存一个观察者集合,可以增加与删除观察者对象,并能通知观察者对象。

    具体主题(Subject):继承抽象主题,拥有具体的主题状态。

    通知接口(INotify):观察着实现的通知到达时统一更新自身接口。

    观察者(ConcreateObserver):实现通知接口的具体类。

    类图

    clip_image002

    实现代码

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 抽象主题

    /// </summary>

    public abstract class AbstractSubject

    {

    /// <summary>

    /// 观察者列表

    /// </summary>

    private List<INotify> ObserverList = new List<INotify> ();

    /// <summary>

    /// 注册观察着

    /// </summary>

    /// <param name="observer"></param>

    public void Register(INotify observer)

    {

    ObserverList.Add(observer);

    Console.WriteLine(
    "Register:{0}", observer.Name);

    }

    /// <summary>

    /// 移除观察者

    /// </summary>

    /// <param name="observer"></param>

    public void UnRegister(INotify observer)

    {

    ObserverList.Remove (observer);

    Console.WriteLine(
    "UnRegister:{0}", observer.Name);

    }

    /// <summary>

    /// 通知观察者

    /// </summary>

    public void NotifyObserver()

    {

    for (int i = 0; i < ObserverList.Count; i++)

    {

    ObserverList[i].Notify(
    this);

    }

    }

    }

    }

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 具体主题

    /// </summary>

    public class ConcreateSubject : AbstractSubject

    {

    /// <summary>

    /// 状态

    /// </summary>

    private string state;

    public string State

    {

    get

    {

    return state; 

    }

    set

    {

    state 
    = value;

    }

    }

    }

    }

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 消息通知接口

    /// </summary>

    public interface INotify

    {

    /// <summary>

    /// 名称

    /// </summary>

    string Name

    {

    get;

    set;

    }

    /// <summary>

    /// 通知

    /// </summary>

    /// <param name="sender"></param>

    void Notify(object sender);

    }

    }

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 观察着B

    /// </summary>

    public class ConcreateObserverA : INotify

    {

    private string name;

    public ConcreateObserverA(string name)

    {

    this.name = name;

    }

    public string Name

    {

    get { return name; }

    set { name = value; }

    }

    #region INotify 成员

    public void Notify(object sender)

    {

    ConcreateSubject sub
    =sender as ConcreateSubject ;

    string info = string.Format("Type:{0} Name:{1} Notify:{2}"this.GetType().FullName, Name, sub.State.ToString());

    Console.WriteLine(info);

    }

    #endregion

    }

    }

    namespace Hbb0b0.DesignPatter

    {

    /// <summary>

    /// 观察者B

    /// </summary>

    public class ConcreateObserverB : INotify

    {

    private string name;

    public ConcreateObserverB(string name)

    {

    this.name = name;

    }

    public string Name

    {

    get { return name; }

    set { name = value; }

    }

    #region INotify 成员

    public void Notify(object sender)

    {

    ConcreateSubject sub 
    = sender as ConcreateSubject;

    string info = string.Format("Type:{0} Name:{1} Notify:{2}"this.GetType().FullName, Name, sub.State );

    Console.WriteLine(info);

    }

    #endregion

    }

    }

    调用
    namespace Hbb0b0.DesignPatter

    {

    class ObserverMain

    {

    static internal void Run()

    {

    //具体主题

    ConcreateSubject subject 
    = new ConcreateSubject();

    //观察者A1

    ConcreateObserverA observerA1 
    = new ConcreateObserverA("A1");

    //注册A1

    subject.Register(observerA1);

    //观察者A2

    ConcreateObserverA observerA2 
    = new ConcreateObserverA("A2");

    //注册A2

    subject.Register(observerA2);

    //观察着B1

    ConcreateObserverB observerB1 
    = new ConcreateObserverB("B1");

    //注册B1

    subject.Register(observerB1);

    //观察者B2

    ConcreateObserverB observerB2 
    = new ConcreateObserverB("B2");

    //注册者B2

    subject.Register(observerB2);

    //通知观察者

    //主题状态更新

    subject.State 
    = "State A";

    subject.NotifyObserver();

    //注销观察者

    subject.UnRegister(observerA2);

    subject.UnRegister(observerB1);

    //通知观察者

    //主题状态更新

    subject.State 
    ="State B";

    subject.NotifyObserver();

    }

    }

    }

    运行结果

    clip_image004

  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1959517.html
Copyright © 2011-2022 走看看