CSharp: Observer Pattern in donet core 3

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/// <summary>
    ///观察者模式 Observer Pattern  亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observe
    /// geovindu,Geovin Du eidt
    ///
    /// </summary>
    interface IObserver
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="celeb">对象</param>
        void Update(ICelebrity celeb);
    }
 
    /// <summary>
    /// /
    /// </summary>
    class ObserverType1 : IObserver
    {
 
        /// <summary>
        /// 名称
        /// </summary>
        string nameOfObserver;
 
        /// <summary>
        /// /
        /// </summary>
        /// <param name="name">输入名称</param>
        public ObserverType1(String name)
        {
            this.nameOfObserver = name;
        }
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="celeb"></param>
        public void Update(ICelebrity celeb)
        {
            Console.WriteLine($"{nameOfObserver} has received(接收) an alert from {celeb.Name}.Updated value is(更新标志值): {celeb.Flag}");
        }
 
    }
 
    /// <summary>
    ///
    /// </summary>
    class ObserverType2 : IObserver
    {
 
        /// <summary>
        /// 名称
        /// </summary>
        string nameOfObserver;
        /// <summary>
        ///
        /// </summary>
        /// <param name="name">输入名称</param>
        public ObserverType2(String name)
        {
            this.nameOfObserver = name;
        }
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="celeb"></param>
        public void Update(ICelebrity celeb)
        {
            Console.WriteLine($"{nameOfObserver} notified(通知).Inside {celeb.Name}, the updated value is: {celeb.Flag}");
        }
    }
    /// <summary>
    ///
    /// </summary>
    interface ICelebrity
    {
        /// <summary>
        /// Name of Subject
        /// 名称
        /// </summary>
        string Name { get; }
        /// <summary>
        /// 标记
        /// </summary>
        int Flag { get; set; }
        /// <summary>
        /// To register
        /// 注册
        /// </summary>
        /// <param name="o"></param>
        void Register(IObserver o);
        /// <summary>
        /// To Unregister
        /// 取消注册
        /// </summary>
        /// <param name="o"></param>
        void Unregister(IObserver o);
        ///<summary>
        ///To notify registered users      
        ///注册用户
        /// </summary>
        void NotifyRegisteredUsers();
 
    }
 
    /// <summary>
    ///
    /// </summary>
    class Celebrity : ICelebrity
    {
 
        /// <summary>
        /// 对像数列
        /// </summary>
        List<IObserver> observerList = new List<IObserver>();
        /// <summary>
        /// 标记
        /// </summary>
        private int flag;
 
        /// <summary>
        /// 标记
        /// </summary>
        public int Flag
        {
            get
            {
                return flag;
            }
            set
            {
                flag = value;
                //Flag value changed. So notify observer(s).
                NotifyRegisteredUsers();
            }
        }
 
        /// <summary>
        ///
        /// </summary>
        private string name;
        /// <summary>
        ///
        /// </summary>
        /// <param name="name">输入名称</param>
        public Celebrity(string name)
        {
            this.name = name;
        }
        //public string Name
        //{
        //    get
        //    {
        //        return name;
        //    }          
        //}
        //Or, simply use expression bodied
        //properties(C#6.0 onwards)
        /// <summary>
        ///
        /// </summary>
        public string Name => name;
 
        /// <summary>
        /// To register an observer.
        /// </summary>
        /// <param name="anObserver">对象</param>
        public void Register(IObserver anObserver)
        {
            observerList.Add(anObserver);
        }
       
        /// <summary>
        /// To unregister an observer.
        /// </summary>
        /// <param name="anObserver"></param>
        public void Unregister(IObserver anObserver)
        {
            observerList.Remove(anObserver);
        }
    
        /// <summary>
        /// Notify all registered observers.
        /// </summary>
        public void NotifyRegisteredUsers()
        {
            foreach (IObserver observer in observerList)
            {
                observer.Update(this);
            }
        }
    }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/// <summary>
  ///观察者模式 Observer Pattern  亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observe
  /// geovindu,Geovin Du eidt
  /// 产品
  /// </summary>
  public class Product : INotifyPropertyChanged
  {
 
      /// <summary>
      /// 名特
      /// </summary>
      private string name;
      /// <summary>
      /// 名称
      /// </summary>
      public string Name
      {
          get => name;
          set
          {
              if (value == name) return; // critical
              name = value;
              OnPropertyChanged();
          }
      }
      /// <summary>
      ///
      /// </summary>
      public event PropertyChangedEventHandler PropertyChanged;
      /// <summary>
      ///
      /// </summary>
      /// <param name="propertyName"></param>
      [NotifyPropertyChangedInvocator]
      protected virtual void OnPropertyChanged(
        [CallerMemberName] string propertyName = null)
      {
          PropertyChanged?.Invoke(this,
            new PropertyChangedEventArgs(propertyName));
      }
      /// <summary>
      ///
      /// </summary>
      /// <returns></returns>
      public override string ToString()
      {
          return $"产品名称: {Name}";
      }
  }
  /// <summary>
  /// 窗口
  /// </summary>
  public class Window : INotifyPropertyChanged
  {
      /// <summary>
      ///
      /// </summary>
      private string productName;
      /// <summary>
      ///
      /// </summary>
      public string ProductName
      {
          get => productName;
          set
          {
              if (value == productName) return; // critical
              productName = value;
              OnPropertyChanged();
          }
      }
      /// <summary>
      ///
      /// </summary>
      public event PropertyChangedEventHandler PropertyChanged;
      /// <summary>
      ///
      /// </summary>
      /// <param name="propertyName"></param>
      [NotifyPropertyChangedInvocator]
      protected virtual void OnPropertyChanged(
        [CallerMemberName] string propertyName = null)
      {
          PropertyChanged?.Invoke(this,
            new PropertyChangedEventArgs(propertyName));
      }
      /// <summary>
      ///
      /// </summary>
      /// <returns></returns>
      public override string ToString()
      {
          return $"窗口: {ProductName}";
      }
  }
  /// <summary>
  ///
  /// </summary>
  public sealed class BidirectionalBinding : IDisposable
  {
 
      /// <summary>
      ///
      /// </summary>
      private bool disposed;
      /// <summary>
      ///
      /// </summary>
      /// <param name="first"></param>
      /// <param name="firstProperty"></param>
      /// <param name="second"></param>
      /// <param name="secondProperty"></param>
      public BidirectionalBinding(
        INotifyPropertyChanged first,
        Expression<Func<object>> firstProperty,
        INotifyPropertyChanged second,
        Expression<Func<object>> secondProperty)
      {
          if (firstProperty.Body is MemberExpression firstExpr
              && secondProperty.Body is MemberExpression secondExpr)
          {
              if (firstExpr.Member is PropertyInfo firstProp
                  && secondExpr.Member is PropertyInfo secondProp)
              {
                  first.PropertyChanged += (sender, args) =>
                  {
                      if (!disposed)
                      {
                          secondProp.SetValue(second, firstProp.GetValue(first));
                      }
                  };
                  second.PropertyChanged += (sender, args) =>
                  {
                      if (!disposed)
                      {
                          firstProp.SetValue(first, secondProp.GetValue(second));
                      }
                  };
              }
          }
      }
      /// <summary>
      ///
      /// </summary>
      public void Dispose()
      {
          disposed = true;
      }
  }

  

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//观察者模式 Observer Pattern
           Console.WriteLine("***观察者模式 Observer Pattern Demonstration.***\n");
           //We have 4 observers-2 of them are ObserverType1, 1  is of ObserverType2
           IObserver myObserver1 = new ObserverType1("刘二");
           IObserver myObserver2 = new ObserverType1("刘三");
           IObserver myObserver3 = new ObserverType2("刘四");
           IObserver myObserver4 = new ObserverType2("刘五");
           Console.WriteLine("Working with first celebrity now.");
           ICelebrity celebrity = new Celebrity("Celebrity名人-1组");
           //Registering the observers-Roy,Kevin,Bose
           celebrity.Register(myObserver1);
           celebrity.Register(myObserver2);
           celebrity.Register(myObserver3);
           Console.WriteLine(" Celebrity-1 is setting Flag 设置标志 = 5.");
           celebrity.Flag = 5;
           /*
           Kevin doesn't want to get further notification.
           So, unregistering the observer(Kevin)).
           */
           Console.WriteLine("\nCelebrity-名人1组 is removing(移除) 刘三 from the observer list now.");
           celebrity.Unregister(myObserver2);           
           //No notification is sent to Kevin this time. He has unregistered.
           Console.WriteLine("\n Celebrity-名人1组 is setting Flag 设置标志= 50.");
           celebrity.Flag = 50;
           //Kevin is registering himself again
           celebrity.Register(myObserver2);
           Console.WriteLine("\n Celebrity-名人1组 is setting Flag 设置标志= 100.");
           celebrity.Flag = 100;
 
           Console.WriteLine("\n Working with another celebrity now.");
           //Creating another celebrity
           ICelebrity celebrity2 = new Celebrity("Celebrity-名人2组");
           //Registering the observers-Roy and Jacklin
           celebrity2.Register(myObserver1);
           celebrity2.Register(myObserver4);
           Console.WriteLine("\n --Celebrity-名人2组 is setting Flag value as设置标志 500.--");
           celebrity2.Flag = 500;
 
           //
           var product = new Product { Name = "书" };
           var window = new Window { ProductName = "书" };
 
           // want to ensure that when product name changes
           // in one component, it also changes in another
 
           product.PropertyChanged += (sender, eventArgs) =>
           {
               if (eventArgs.PropertyName == "Name")
               {
                   Console.WriteLine("Name changed in Product");
                   window.ProductName = product.Name;
                   Console.WriteLine("changed 1." + product);
                   Console.WriteLine("changed 1." + window);
               }
           };
 
           window.PropertyChanged += (sender, eventArgs) =>
           {
               if (eventArgs.PropertyName == "ProductName")
               {
                   Console.WriteLine("Name changed in Window");
                   product.Name = window.ProductName;
                   Console.WriteLine("changed 2." + product);
                   Console.WriteLine("changed 2." + window);
               }
           };
 
           using var binding = new BidirectionalBinding(
             product,
             () => product.Name,
             window,
             () => window.ProductName);
 
           Console.WriteLine("1."+product); //书
           Console.WriteLine("2."+window);
 
           // there is no infinite loop because of
           // self-assignment guard
           product.Name = "桌子";
           window.ProductName = "椅子";
 
           Console.WriteLine(product);
           Console.WriteLine(window);
 
 
 
           Console.ReadKey();

  

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
***观察者模式 Observer Pattern Demonstration.***
 
Working with first celebrity now.
 Celebrity-1 is setting Flag 设置标志 = 5.
刘二 has received(接收) an alert from Celebrity名人-1组.Updated value is(更新标志值): 5
刘三 has received(接收) an alert from Celebrity名人-1组.Updated value is(更新标志值): 5
刘四 notified(通知).Inside Celebrity名人-1组, the updated value is: 5
 
Celebrity-名人1组 is removing(移除) 刘三 from the observer list now.
 
 Celebrity-名人1组 is setting Flag 设置标志= 50.
刘二 has received(接收) an alert from Celebrity名人-1组.Updated value is(更新标志值): 50
刘四 notified(通知).Inside Celebrity名人-1组, the updated value is: 50
 
 Celebrity-名人1组 is setting Flag 设置标志= 100.
刘二 has received(接收) an alert from Celebrity名人-1组.Updated value is(更新标志值): 100
刘四 notified(通知).Inside Celebrity名人-1组, the updated value is: 100
刘三 has received(接收) an alert from Celebrity名人-1组.Updated value is(更新标志值): 100
 
 Working with another celebrity now.
 
 --Celebrity-名人2组 is setting Flag value as设置标志 500.--
刘二 has received(接收) an alert from Celebrity-名人2组.Updated value is(更新标志值): 500
刘五 notified(通知).Inside Celebrity-名人2组, the updated value is: 500
1.产品名称: 书
2.窗口: 书
Name changed in Product
Name changed in Window
changed 2.产品名称: 桌子
changed 2.窗口: 桌子
changed 1.产品名称: 桌子
changed 1.窗口: 桌子
Name changed in Window
Name changed in Product
changed 1.产品名称: 椅子
changed 1.窗口: 椅子
changed 2.产品名称: 椅子
changed 2.窗口: 椅子
产品名称: 椅子
窗口: 椅子

  

posted @   ®Geovin Du Dream Park™  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示