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

    意图:  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

    适用性: 

    • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
    • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

    namespace Observer_DesignPattern
    {
        using System;
        using System.Collections;

    class Subject
    {
    private ArrayList list = new ArrayList();

    private string strImportantSubjectData = "Initial";

    public string ImportantSubjectData
    {
    get
    {
    return strImportantSubjectData;
    }
    set
    {
    strImportantSubjectData = value;
    }
    }

    public void Attach(Observer o)
    {
    list.Add(o);
    o.ObservedSubject = this;
    }

    public void Detach(Observer o)
    {

    }

    public void Notify()
    {
    foreach (Observer o in list)
    {
    o.Update();
    }
    }
    }

    class ConcreteSubject : Subject
    {
    public void GetState()
    {

    }

    public void SetState()
    {

    }
    }

    abstract class Observer
    {
    protected Subject s;
    public Subject ObservedSubject
    {
    get
    {
    return s;
    }
    set
    {
    s = value;
    }
    }
    abstract public void Update();
    }

    class ConcreteObserver : Observer
    {
    private string observerName;

    public ConcreteObserver(string name)
    {
    observerName = name;
    }

    override public void Update()
    {
    Console.WriteLine("In Observer {0}: data from subject = {1}",
    observerName, s.ImportantSubjectData);
    }
    }

        /// <summary>
        ///    Summary description for Client.
        /// </summary>
        public class Client
        {    
            public static int Main(string[] args)
            {         
    // Set up everything
    ConcreteSubject s = new ConcreteSubject();
    ConcreteObserver o1 = new ConcreteObserver("first observer");
    ConcreteObserver o2 = new ConcreteObserver("second observer");

    s.Attach(o1);
    s.Attach(o2);

    // make changes to subject
    s. ImportantSubjectData = "This is important subject data";

    // Notify all observers
    s.Notify();
                 return 0;
            }
        }

  • 相关阅读:
    weekly review 200908: Talk Show of ASP.NET
    weeklyreview 200911: Drowse of Spring
    数据库中标识种子(否,是,是(不用于复制))解释
    Hashtable.ContainsKey跟Hashtable.Contains的区别
    【Oracle学习起步1】用户解锁及密码输入问题
    C#弹出对话框实现
    因为文件组 'PRIMARY' 已满。
    SQL删除数据的各种方式总结
    C standard library contents
    scanf("%c",&c)前的printf函数调用问题
  • 原文地址:https://www.cnblogs.com/sophie/p/231386.html
Copyright © 2011-2022 走看看