zoukankan      html  css  js  c++  java
  • 行为型设计模式之观察者模式(Observer)

    结构
    意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
    适用性
    • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
    • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
      1  using System;
      2     using System.Collections;
      3 
      4     class Subject
      5     {
      6         private ArrayList list = new ArrayList();
      7 
      8         private string strImportantSubjectData = "Initial";
      9         
     10         public string ImportantSubjectData 
     11         {
     12             get 
     13             {
     14                 return strImportantSubjectData;
     15             }
     16             set 
     17             {
     18                 strImportantSubjectData = value;
     19             }
     20         }
     21 
     22         public void Attach(Observer o)
     23         {
     24             list.Add(o);
     25             o.ObservedSubject = this;
     26         }
     27 
     28         public void Detach(Observer o)
     29         {
     30             
     31         }
     32 
     33         public void Notify()
     34         {
     35             foreach (Observer o in list)        
     36             {
     37                 o.Update();
     38             }            
     39         }
     40     }
     41 
     42     class ConcreteSubject : Subject
     43     {
     44         public void GetState()
     45         {
     46             
     47         }
     48 
     49         public void SetState()
     50         {
     51             
     52         }    
     53     }
     54 
     55     abstract class Observer 
     56     {
     57         protected Subject s;
     58         public Subject ObservedSubject 
     59         {
     60             get 
     61             {
     62                 return s;        
     63             }
     64             set 
     65             {
     66                 s = value;
     67             }
     68         }    
     69         abstract public void Update();
     70     }
     71 
     72     class ConcreteObserver : Observer 
     73     {
     74         private string observerName;
     75         
     76         public ConcreteObserver(string name)
     77         {
     78             observerName = name;
     79         }
     80 
     81         override public void Update()
     82         {
     83             Console.WriteLine("In Observer {0}: data from subject = {1}", 
     84                 observerName, s.ImportantSubjectData);
     85         }    
     86     }
     87 
     88     /// <summary>
     89     ///    Summary description for Client.
     90     /// </summary>
     91     public class Client
     92     {     
     93         public static int Main(string[] args)
     94         {          
     95             // Set up everything
     96             ConcreteSubject s = new ConcreteSubject();
     97             ConcreteObserver o1 = new ConcreteObserver("first observer");
     98             ConcreteObserver o2 = new ConcreteObserver("second observer");
     99 
    100             s.Attach(o1);
    101             s.Attach(o2);
    102 
    103             // make changes to subject
    104             s. ImportantSubjectData = "This is important subject data";
    105 
    106             // Notify all observers
    107             s.Notify();            
    108             return 0;
    109         }
    110     }
    观察者模式
  • 相关阅读:
    GIS的发展
    ajax请求头加Token时发生的跨域(CORS)请求问题
    js 给定时间,如'20130830',换算和今天的天数差
    过程改进点滴需求调研经验之一
    昨天向PAM推荐的好书
    关于专人整理和分析需求
    走出开发混沌
    过程改进点滴需求调研经验之二
    代码重构注意事项
    插件框架内核完成
  • 原文地址:https://www.cnblogs.com/ziranquliu/p/4653405.html
Copyright © 2011-2022 走看看