标签:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //连接发布者和订阅者
6 Thermostat tm = new Thermostat();
7 Cooler cl = new Cooler(40);
8 Heater ht = new Heater(60);
9 //设置委托变量关联的方法。+=可以存储多个方法,这些方法称为订阅者。
10 tm.OnTemperatureChange += cl.OnTemperatureChanged;
11 tm.OnTemperatureChange += ht.OnTemperatureChanged;
12 string temperature = Console.ReadLine();
13
14 //将数据发布给订阅者(本质是依次运行那些方法)
15 tm.OnTemperatureChange(float.Parse(temperature));
16
17 Console.ReadLine();
18
19
20
21 }
22 }
23 //两个订阅者类
24 class Cooler
25 {
26 public Cooler(float temperature)
27 {
28 _Temperature = temperature;
29 }
30 private float _Temperature;
31 public float Temperature
32 {
33 set
34 {
35 _Temperature = value;
36 }
37 get
38 {
39 return _Temperature;
40 }
41 }
42
43 //将来会用作委托变量使用,也称为订阅者方法
44 public void OnTemperatureChanged(float newTemperature)
45 {
46 if (newTemperature > _Temperature)
47 {
48 Console.WriteLine("Cooler:on ! ");
49 }
50 else
51 {
52 Console.WriteLine("Cooler:off ! ");
53 }
54 }
55 }
56 class Heater
57 {
58 public Heater(float temperature)
59 {
60 _Temperature = temperature;
61 }
62 private float _Temperature;
63 public float Temperature
64 {
65 set
66 {
67 _Temperature = value;
68 }
69 get
70 {
71 return _Temperature;
72 }
73 }
74 public void OnTemperatureChanged(float newTemperature)
75 {
76 if (newTemperature < _Temperature)
77 {
78 Console.WriteLine("Heater:on ! ");
79 }
80 else
81 {
82 Console.WriteLine("Heater:off ! ");
83 }
84 }
85 }
86
87
88 //发布者
89 class Thermostat
90 {
91
92 //定义一个委托类型
93 public delegate void TemperatureChangeHanlder(float newTemperature);
94 //定义一个委托类型变量,用来存储订阅者列表。注:只需一个委托字段就可以存储所有订阅者。
95 private TemperatureChangeHanlder _OnTemperatureChange;
96 //现在的温度
97 private float _CurrentTemperature;
98
99 public TemperatureChangeHanlder OnTemperatureChange
100 {
101 set { _OnTemperatureChange = value; }
102 get { return _OnTemperatureChange; }
103 }
104
105
106 public float CurrentTemperature
107 {
108 get { return _CurrentTemperature;}
109 set
110 {
111 if (value != _CurrentTemperature)
112 {
113 _CurrentTemperature = value;
114 }
115 }
116 }
117 }
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
OnTemperatureChange(value);
}
}
}
public float CurrentTemperature
{
get { return _CurrentTemperature; }
set
{
if (value != _CurrentTemperature)
{
_CurrentTemperature = value;
TemperatureChangeHanlder localOnChange = OnTemperatureChange;
if (localOnChange != null)
{
//OnTemperatureChange = null;
localOnChange(value);
}
}
}
}
1 Thermostat.TemperatureChangeHanlder delegate1;
2 Thermostat.TemperatureChangeHanlder delegate2;
3 Thermostat.TemperatureChangeHanlder delegate3;
4 delegate3 = tm.OnTemperatureChange;
5 delegate1 = cl.OnTemperatureChanged;
6 delegate2 = ht.OnTemperatureChanged;
7 delegate3 += delegate1;
8 delegate3 += delegate2;
1 Thermostat.TemperatureChangeHanlder delegate1;
2 Thermostat.TemperatureChangeHanlder delegate2;
3 Thermostat.TemperatureChangeHanlder delegate3;
4 delegate1 = cl.OnTemperatureChanged;
5 delegate2 = ht.OnTemperatureChanged;
6 delegate3 = delegate1 + delegate2;
7 delegate3 = delegate3 - delegate2;
8 tm.OnTemperatureChange = delegate3;
1 public float CurrentTemperature
2 {
3 get { return _CurrentTemperature; }
4 set
5 {
6 if (value != _CurrentTemperature)
7 {
8
9 _CurrentTemperature = value;
10 TemperatureChangeHanlder localOnChange = OnTemperatureChange;
11 if (localOnChange != null)
12 {
13 foreach (TemperatureChangeHanlder hanlder in localOnChange.GetInvocationList())
14 {
15 try
16 {
17 hanlder(value);
18 }
19 catch (Exception e)
20 {
21 Console.WriteLine(e.Message);
22
23 }
24 }
25 }
26
27 }
28 }
29 }
1 public class Thermostat
2 {
3 private float _CurrentTemperature;
4 public float CurrentTemperature
5 {
6 set { _CurrentTemperature = value; }
7 get { return _CurrentTemperature; }
8 }
9 //定义委托类型
10 public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
11
12 //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
13 public event TemperatureChangeHandler OnTemperatureChange = delegate { };
14
15
16 public class TemperatureArgs : System.EventArgs
17 {
18 private float _newTemperature;
19 public float NewTemperature
20 {
21 set { _newTemperature = value; }
22 get { return _newTemperature; }
23 }
24 public TemperatureArgs(float newTemperature)
25 {
26 _newTemperature = newTemperature;
27 }
28
29 }
30 }
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Thermostat tm = new Thermostat();
6
7 Cooler cl = new Cooler(40);
8 Heater ht = new Heater(60);
9
10 //设置订阅者(方法)
11 tm.OnTemperatureChange += cl.OnTemperatureChanged;
12 tm.OnTemperatureChange += ht.OnTemperatureChanged;
13
14 tm.CurrentTemperature = 100;
15 }
16 }
17 //发布者类
18 public class Thermostat
19 {
20 private float _CurrentTemperature;
21 public float CurrentTemperature
22 {
23 set
24 {
25 if (value != _CurrentTemperature)
26 {
27 _CurrentTemperature = value;
28 if (OnTemperatureChange != null)
29 {
30 OnTemperatureChange(this, new TemperatureArgs(value));
31 }
32
33 }
34 }
35 get { return _CurrentTemperature; }
36 }
37 //定义委托类型
38 public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
39
40 //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
41 public event TemperatureChangeHandler OnTemperatureChange = delegate { };
42
43 //用来给事件传递的数据类型
44 public class TemperatureArgs : System.EventArgs
45 {
46 private float _newTemperature;
47 public float NewTemperature
48 {
49 set { _newTemperature = value; }
50 get { return _newTemperature; }
51 }
52 public TemperatureArgs(float newTemperature)
53 {
54 _newTemperature = newTemperature;
55 }
56
57 }
58 }
59
60 //两个订阅者类
61 class Cooler
62 {
63 public Cooler(float temperature)
64 {
65 _Temperature = temperature;
66 }
67 private float _Temperature;
68 public float Temperature
69 {
70 set
71 {
72 _Temperature = value;
73 }
74 get
75 {
76 return _Temperature;
77 }
78 }
79
80 //将来会用作委托变量使用,也称为订阅者方法
81 public void OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
82 {
83 if (newTemperature.NewTemperature > _Temperature)
84 {
85 Console.WriteLine("Cooler:on ! ");
86 }
87 else
88 {
89 Console.WriteLine("Cooler:off ! ");
90 }
91 }
92 }
93 class Heater
94 {
95 public Heater(float temperature)
96 {
97 _Temperature = temperature;
98 }
99 private float _Temperature;
100 public float Temperature
101 {
102 set
103 {
104 _Temperature = value;
105 }
106 get
107 {
108 return _Temperature;
109 }
110 }
111 public void OnTemperatureChanged(object sender, Thermostat.TemperatureArgs newTemperature)
112 {
113 if (newTemperature.NewTemperature < _Temperature)
114 {
115 Console.WriteLine("Heater:on ! ");
116 }
117 else
118 {
119 Console.WriteLine("Heater:off ! ");
120 }
121 }
122 }
1 //定义委托类型
2 public delegate void TemperatureChangeHandler(object sender, TemperatureArgs newTemperatrue);
3
4 //定义一个委托变量,并用event修饰,被修饰后有一个新的名字,事件发布者。
5 public event TemperatureChangeHandler OnTemperatureChange = delegate { };
6
7 在编译器的作用下,会自动扩展成:
8 private TemperatureChangeHandler _OnTemperatureChange = delegate { };
9
10 public void add_OnTemperatureChange(TemperatureChangeHandler handler)
11 {
12 Delegate.Combine(_OnTemperatureChange, handler);
13 }
14 public void remove_OnTemperatureChange(TemperatureChangeHandler handler)
15 {
16 Delegate.Remove(_OnTemperatureChange, handler);
17 }
18 public event TemperatureChangeHandler OnTemperatureChange
19 {
20 add
21 {
22 add_OnTemperatureChange(value);
23 }
24
25 remove
26 {
27 remove_OnTemperatureChange(value);
28 }
29
30 }
1 protected TemperatureChangeHandler _OnTemperatureChange = delegate { };
2
3 public event TemperatureChangeHandler OnTemperatureChange
4 {
5 add
6 {
7 //此处代码可以自定义
8 Delegate.Combine(_OnTemperatureChange, value);
9
10 }
11
12 remove
13 {
14 //此处代码可以自定义
15 Delegate.Remove(_OnTemperatureChange, value);
16 }
17
18 }
标签:
原文地址:http://www.cnblogs.com/tlxxm/p/4663160.html