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;
            }
        }

  • 相关阅读:
    unity基础之C#基础——[转]大白话系列之C#委托与事件讲解(一)
    [转]ListView滚动到底部自动加载数据
    [转]Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法
    EditText光标不显示
    Android应用实例之---使用Linkify + 正则式区分微博文本链接及跳转处理
    安卓自定义控件
    安卓ViewFlipper和ViewPager
    安卓Binder机制简析
    《深入浅出Mysql》笔记---优化
    《高性能MySQL》學習筆記--索引
  • 原文地址:https://www.cnblogs.com/sophie/p/231386.html
Copyright © 2011-2022 走看看