zoukankan      html  css  js  c++  java
  • 设计模式:观察者模式(Observer)

    定  义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生

            变化时,会通知所有观察者对象,使他们能够自动更新自己。

    结构图

    抽象主题类

    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 Detach(Observer observer)
            {
                observers.Remove(observer);
            }
    
            //通知
            public void Notify()
            {
                foreach (Observer observer in observers)
                {
                    observer.Update();
                }
            }
        }
    View Code

    抽象观察者类

     abstract class Observer
        {
            public abstract void Update();
        }
    View Code

    具体主题类

     class ConcreteSubject : Subject
        {
            private string subjectState;
    
            //具体被观察者状态
            public string SubjectState
            {
                get { return subjectState; }
                set { subjectState = value; }
            }
        }
    View Code

    具体观察者类

     class ConcreteObserver : Observer
        {
            private string name;
            private string observerState;
            private ConcreteSubject subject;
    
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this.name = name;
                this.subject = subject;
            }
    
            public override void Update()
            {
                observerState = subject.SubjectState;
                Console.WriteLine("观察者{0}的新状态为{1}", name, observerState);
            }
    
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
        }
    View Code

    客户端代码

                ConcreteSubject s = new ConcreteSubject();
    
                s.Attach(new ConcreteObserver(s, "X"));
                s.Attach(new ConcreteObserver(s, "Y"));
                s.Attach(new ConcreteObserver(s, "Z"));
    
                s.SubjectState = "ABC";
                s.Notify();    
    View Code
  • 相关阅读:
    得到相对Plugin的路径
    GEF常见问题4:非矩形图元
    在Eclipse的About对话框上添加自己的图标
    用GMF生成简化的数据库设计器
    全超实用的Javascript类库和jQuery插件大全之一:图片,地图和图形
    #敏捷个人# 第二批敏捷个人推广者实践团报名
    2012年最新的12款超棒jQuery插件
    《敏捷个人》周刊 第14期 (可下载)
    时间管理:敏捷个人时中法卡片
    #敏捷个人# 实践团报名
  • 原文地址:https://www.cnblogs.com/qianxingdewoniu/p/3547579.html
Copyright © 2011-2022 走看看