>无扰阅读模式(测试)
事件
[Event]
发生→相应”的五个动作:
- 事件是使对象或类具备通知能力的成员
- 事件功能=功能+参数(可选)
- 使用:用于对象或类间的动作协调与信息传递(消息推送)
①原理
事件模型中的两个“5”:
“发生→相应” 中的五个部分:
“闹钟1 响了2 我3 起床4”
1发生事件的对象 2事件的内容 3对事件做出响应的对象 4对事件做出响应的对象的响应内容
5订阅关系
“发生→相应”的五个动作:
⑴我有一个事件→⑵一个人或一群人关心我的这个事件→⑶事件发生了→⑷关心这个事件的人被依次通知→⑸被通知的人根据拿到的事件参数对事件进行响应
提示: 1. 事件多用于桌面、手机等开发客户端的编程,因为这些程序经常是用户通过事件来“驱动”的。 1. 各编程语言对这个机制实现的方法不尽相同,Java语言无事件成员也无委托这种数据类型,其“事件”是使用接口实现的。 1. MVC、MVP、MVVM等模式,是事件模式更高级、更有效的玩法。 1. 日常开发的时候,使用已有事件的机会比较多,自己声明事件的机会比较少。 ## ②事件的应用(使用事件)
功能
实现形式
事件的拥有者
对象
事件成员
成员
事件响应者
对象
事件处理器
成员
事件订阅
(委托)*
*把事件处理器与事件关联在一起,本质上是一种委托类型为基础的约定
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Program { static void Main(string[] args) { Timer timer=new Timer(); timer.Interval=1000; Boy boy=new Boy(); timer.Elapsed+=boy.Action; timer.Start(); } } class Boy { internal void Action(object sender,ElapsedEventArgs e) { Console.Writeline("Jump!"); } }
|
两种挂接方式
1 2
| this.button.Click+=new EventHandler(this.ButtonClicked); this.button.Click+=this.ButtonClicked;
|
③事件的声明(自定义事件)
四种事件构建形式:
示例(使用简化版,注释掉的为标准版):
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
| using System; using System.Threading;
namespace @event { class Program {
static void Main(string[] args) { Customer customer = new Customer(); Waiter waiter = new Waiter(); customer.Order += waiter.Action; customer.Action(); customer.PayTheBill(); Console.ReadLine(); } }
public class OrderEventArgs : EventArgs { public string DishName { get; set; } public string Size { get; set; } }
public delegate void OrderEventHander(Customer customer, OrderEventArgs e);
public class Customer { private OrderEventHander orderEventHander;
public event OrderEventHander Order;
public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("Customer:I will pay ${0}.", this.Bill); }
public void Walkin() { Console.WriteLine("Customer:Walk in the restaurant."); }
public void SetDown() { Console.WriteLine(); }
public void Think() { for (int i = 0; i < 5; i++) { Console.WriteLine("Customer:Let me think..."); Thread.Sleep(1000); }
if (this.Order != null) { OrderEventArgs e = new OrderEventArgs(); e.DishName = "Kongpao Chicken"; e.Size = "large"; this.Order.Invoke(this, e); } }
public void Action() { this.Walkin(); this.SetDown(); this.Think(); } }
public class Waiter { public void Action(Customer customer, OrderEventArgs e) { Console.WriteLine("Waiter:I will serve you the dish -{0}", e.DishName); double price = 10; switch (e.Size) { case "large": price *= 1.5; break; case "small": price *= 0.5; break; default: break; }
customer.Bill += price; } }
}
|
运行结果:
归纳总结:
④后记: