zoukankan      html  css  js  c++  java
  • 简单的事件示例代码

    简单的事件示例代码

    简单的事件示例代码:

    完整形式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Timers;
    
    /*
     * 事件模型的五个组成部分
     * 1. 事件的拥有者(event source, 对象) 
     * 2. 事件的成员(event, 成员)
     * 3. 事件的响应者(event subscriber, 对象)
     * 4. 事件的处理器(event handler, 成员)
     * 5. 事件订阅 --- 把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”
     */
    
    namespace ConsoleAppTestDemo1
    {
        // 委托类型声明
        public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
    
        // 事件的参数
        public class OrderEventArgs : EventArgs
        {
            public string DishName { get; set; }
            public string Size { get; set; }
    
        }
    
        // 事件的拥有者(event source) --- 客人
        public class Customer
        {
            // 委托类型的字段
            private OrderEventHandler ordereventHandler;
    
            // 事件成员(event) --- 委托字段的包装器,对委托字段的访问起限制作用
            public event OrderEventHandler Order
            {
                add
                {
                    this.ordereventHandler += value;
                }
    
                remove
                {
                    this.ordereventHandler -= value;
                }
            }
    
            // 需要支付的金额
            public double Bill { get; set; }
    
            // 付款
            public void PayTheBill()
            {
                Console.WriteLine($"I will pay ${this.Bill}");
            }
    
            // 思考点菜
            public void ThinkDishes()
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Let me think");
                    Thread.Sleep(1000);
                }
    
                this.OnOrder("Kongpao Chicken", "large");
            }
    
            // 触发事件,当存在事件的处理器时,处理该事件 --- 访问级别为 protected 不能为 public
            protected void OnOrder(string dishName, string size)
            {
                if (this.ordereventHandler != null)
                {
                    OrderEventArgs e = new OrderEventArgs() { DishName = dishName, Size = size };
                    this.ordereventHandler.Invoke(this, e);
                }
    
            }
    
            // 开始点菜,触发事件
            public void Action()
            {
                Console.WriteLine("start order dishes ...");
                this.ThinkDishes();
            }
        }
    
        // 事件的响应者(event subscriber) --- 服务员
        public class Waiter
        {
            // 事件处理器(event handler) --- 上菜计费
            public void Action(Customer customer, OrderEventArgs e)
            {
                Console.WriteLine($"I will server you then dish - {e.DishName} {e.Size}");
                double price = 10;
                switch (e.Size)
                {
                    case "small":
                        price = price * 0.5;
                        break;
                    case "large":
                        price = price * 1.5;
                        break;
                    default:
                        break;
                }
    
                customer.Bill += price;
            }
        }
    
        class TestDemo1
        {
    
            static void Main(string[] args)
            {
                Customer customer = new Customer();
                Waiter waiter = new Waiter();
                // 事件订阅
                customer.Order += new OrderEventHandler(waiter.Action);
    
                // 点菜 -- 有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                // 点菜 -- 有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                // 取消订阅
                customer.Order -= new OrderEventHandler(waiter.Action);
    
                // 点菜 --- 没有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                Console.ReadLine();
            }
        }
    }

    简单形式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Timers;
    
    /*
     * 事件模型的五个组成部分
     * 1. 事件的拥有者(event source, 对象) 
     * 2. 事件的成员(event, 成员)
     * 3. 事件的响应者(event subscriber, 对象)
     * 4. 事件的处理器(event handler, 成员)
     * 5. 事件订阅 --- 把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”
     */
    
    namespace ConsoleAppTestDemo1
    {
    
        // 事件的参数
        public class OrderEventArgs : EventArgs
        {
            public string DishName { get; set; }
            public string Size { get; set; }
    
        }
    
        // 事件的拥有者(event source) --- 客人
        public class Customer
        {
    
            // 事件成员(event) --- 委托字段的包装器,对委托字段的访问起限制作用
            public event EventHandler<OrderEventArgs> Order;
    
            // 需要支付的金额
            public double Bill { get; set; }
    
            // 付款
            public void PayTheBill()
            {
                Console.WriteLine($"I will pay ${this.Bill}");
            }
    
            // 思考点菜
            public void ThinkDishes()
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Let me think");
                    Thread.Sleep(1000);
                }
    
                this.OnOrder("Kongpao Chicken", "large");
            }
    
            // 触发事件,当存在事件的处理器时,处理该事件
            protected void OnOrder(string dishName, string size)
            {
                if (this.Order != null)
                {
                    OrderEventArgs e = new OrderEventArgs() { DishName = dishName, Size = size };
                    this.Order.Invoke(this, e);
                }
    
            }
    
            // 开始点菜,触发事件
            public void Action()
            {
                Console.WriteLine("start order dishes ...");
                this.ThinkDishes();
            }
        }
    
        // 事件的响应者(event subscriber) --- 服务员
        public class Waiter
        {
            // 事件处理器(event handler) --- 上菜计费
            public void Action(object sender, OrderEventArgs e)
            {
                Customer customer = sender as Customer;
    
                Console.WriteLine($"I will server you then dish - {e.DishName} {e.Size}");
                double price = 10;
                switch (e.Size)
                {
                    case "small":
                        price = price * 0.5;
                        break;
                    case "large":
                        price = price * 1.5;
                        break;
                    default:
                        break;
                }
    
                customer.Bill += price;
            }
    
        }
    
        class TestDemo1
        {
    
            static void Main(string[] args)
            {
                Customer customer = new Customer();
                Waiter waiter = new Waiter();
                // 事件订阅
                customer.Order += waiter.Action;
                // 点菜 -- 有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                // 点菜 -- 有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                // 取消订阅
                customer.Order -= waiter.Action;
    
                // 点菜 --- 没有服务员来处理
                customer.Action();
                // 付款
                customer.PayTheBill();
    
                Console.ReadLine();
            }
        }
    }

    输出信息:

    start order dishes ...
    Let me think
    Let me think
    Let me think
    Let me think
    Let me think
    I will server you then dish - Kongpao Chicken large
    I will pay $15
    start order dishes ...
    Let me think
    Let me think
    Let me think
    Let me think
    Let me think
    I will server you then dish - Kongpao Chicken large
    I will pay $30
    start order dishes ...
    Let me think
    Let me think
    Let me think
    Let me think
    Let me think
    I will pay $30
    
    请按任意键继续. . .

    ============ End

  • 相关阅读:
    Unity3d之UGUI- Image拦截Button响应事件
    hdu1114Piggy-Bank(完全背包)
    cf455A boredom
    hdu2084数塔(入门级dp)
    小米线刷出现remote: partition table doesn't exist
    km算法
    hdu1069 Girls and Boys
    CF1203C Common Divisors
    魔法部落
    java命令行运行出现找不到或无法加载类
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/10502529.html
Copyright © 2011-2022 走看看