惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
Cloudbric
Cloudbric
G
GRAHAM CLULEY
S
Securelist
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Project Zero
Project Zero
Spread Privacy
Spread Privacy
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
T
Tailwind CSS Blog
博客园_首页
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Latest news
Latest news
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Attack and Defense Labs
Attack and Defense Labs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
O
OpenAI News
J
Java Code Geeks
T
Tenable Blog
K
Kaspersky official blog
AWS News Blog
AWS News Blog
S
Security @ Cisco Blogs
The GitHub Blog
The GitHub Blog
T
Threatpost
月光博客
月光博客
H
Heimdal Security Blog
Security Latest
Security Latest
The Hacker News
The Hacker News
Y
Y Combinator Blog
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
C
Cisco Blogs
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
D
Docker
Google Online Security Blog
Google Online Security Blog
D
DataBreaches.Net
V
Visual Studio Blog
H
Help Net Security

博客园 - JieNet

MFC中的数据类型 HardwareSerialNumber(硬盘号,CPU号) - JieNet - 博客园 Windows 7 与 XP、Vista 特性对照表 typename 还是超级无敌的基础。。。 函数指针。。。超级无敌的基础了 可变参数的基本应用 关于const和函数 - JieNet - 博客园 iterator类对象和普通指针 .NET中的加密解密:私钥加密(对称加密):AES、DES、RC2、Rijindael、TripleDES 事件 ID: 5603 将DAL层从Sql Server 迁移到 Access 时遇到的问题 ListView:How to.... CSS剪切图片 SQL Server TransAction 全部回滚 所有希腊字母及读音 Error:'Sys' is undefined. VS2008 下安装 AjaxControlToolkit-Framework3.5 JS,CSS 禁止复制,禁止打印,禁止…… ADSL拨号错误代码详解
委托与事件
JieNet · 2009-04-12 · via 博客园 - JieNet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Sample_CUI
{
    
namespace Delegate_And_Event
    {
        
/* 场景
        XXX收到一个解决方案(内网建设方案),是否采用这个方案需要经过2个过程。
        第一个过程(资料确认):需要技术部中User1和User2确认。
        第二个过程(最终确认):需要CTO和CEO确认。

        PS:过程中的确认人数和来自的部门也不同,过程有进展要通知相关的人员进行确认。

*//// <summary>
        
/// 通知事件
        
/// </summary>
        public class WorkNoticeEventArgs : EventArgs
        {
            
/// <summary>
            
/// 要通知的人
            
/// </summary>
            public readonly List<string> users;public WorkNoticeEventArgs(List<string> users)
            {
                
this.users = users;
            }
        }
/// <summary>
        
/// 确认委托
        
/// </summary>
        
/// <param name="sender">确认方法</param>
        
/// <param name="e">通知事件</param>
        public delegate void WorkNoticeEventHandler(object sender,WorkNoticeEventArgs e);/// <summary>
        
/// 资料确认
        
/// </summary>
        public class ProcessDataValidation
        {
            
//声明事件
            public event WorkNoticeEventHandler Begin = null;
            
public event WorkNoticeEventHandler User1Validated = null;
            
public event WorkNoticeEventHandler User2Validated = null;
            
public event WorkNoticeEventHandler Finished = null;//是否确认
            private bool user1Validated, user2Validated;#region Method/// <summary>
            
/// 过程开始
            
/// </summary>
            
/// <param name="users"></param>
            public virtual void OnBegin(List<string> users)
            {
                
//do something
                Console.WriteLine("Begin[{0}]",
                    
this.ToString().Substring(this.ToString().LastIndexOf('.'+ 1)
                    );
                
if (Begin != null)
                {
                    WorkNoticeEventArgs e 
= new WorkNoticeEventArgs(users);
                    Begin(
this,e);//调用订阅此事件的方法
                }
            }
/// <summary>
            
/// User1确认
            
/// </summary>
            
/// <param name="users"></param>
            public virtual void OnUser1Validate(List<string> users)
            {
                
//do something
                user1Validated = true;
                Console.WriteLine(
"Use1 has been validated[{0}]",
                    
this.ToString().Substring(this.ToString().LastIndexOf('.'+ 1)
                    );
                WorkNoticeEventArgs e 
= new WorkNoticeEventArgs(users);
                User1Validated(
this, e);//调用订阅此事件的方法
            }/// <summary>
            
/// User2确认
            
/// </summary>
            
/// <param name="users"></param>
            public virtual void OnUser2Validate(List<string> users)
            {
                
//do something
                user2Validated = true;
                Console.WriteLine(
"Use2 has been validated[{0}]",
                    
this.ToString().Substring(this.ToString().LastIndexOf('.'+ 1)
                    );
                WorkNoticeEventArgs e 
= new WorkNoticeEventArgs(users);
                User2Validated(
this, e);//调用订阅此事件的方法
            }/// <summary>
            
/// 过程完成
            
/// </summary>
            
/// <param name="users"></param>
            public virtual void OnFinish(List<string> users)
            {
                
if (user1Validated && user2Validated)
                {
                    
//do something
                    Console.WriteLine("Finish[{0}]",
                        
this.ToString().Substring(this.ToString().LastIndexOf('.'+ 1)
                        );
                    WorkNoticeEventArgs e 
= new WorkNoticeEventArgs(users);
                    Finished(
this,e);//调用订阅此事件的方法
                }
            }
#endregion

        }

//class ProcessDataValidation
/// <summary>
        
/// 资料确认子类
        
/// </summary>
        public class ProcessDataValidate_NonNetSolution : ProcessDataValidation
        {
            
/// <summary>
            
/// 改写父类方法
            
/// </summary>
            
/// <param name="users"></param>
            public override void OnBegin(List<string> users)
            {
                
//do something
                users.Clear();
                users.Add(
"Jie");
                
base.OnBegin(users);
            }
        }
//class ProcessDataValidate_NonNetSolution

        
/// <summary>
        
/// 工作通知 监视者
        
/// </summary>
        public class WorkNoticeObserver
        {
            
public void NoticeUsersWhenProcessBegin(object sender, WorkNoticeEventArgs e)
            {
                Console.Write(
"Notice:");
                
for (int i = 0; i < e.users.Count; i++)
                {
                    Console.Write(
"{0} ", e.users[i]);
                }
                Console.WriteLine();
                Console.WriteLine();
            }
public void NoticeUsersWhenUser1Validated(object sender, WorkNoticeEventArgs e)
            {
                Console.Write(
"Notice:");
                
for (int i = 0; i < e.users.Count; i++)
                {
                    Console.Write(
"{0} ", e.users[i]);
                }
                Console.WriteLine();
                Console.WriteLine();
            }
public void NoticeUsersWhenUser2Validated(object sender, WorkNoticeEventArgs e)
            {
                Console.Write(
"Notice:");
                
for (int i = 0; i < e.users.Count; i++)
                {
                    Console.Write(
"{0} ", e.users[i]);
                }
                Console.WriteLine();
                Console.WriteLine();
            }
public void NoticeUsersWhenProcessFinished(object sender, WorkNoticeEventArgs e)
            {
                Console.Write(
"Notice:");
                
for (int i = 0; i < e.users.Count; i++)
                {
                    Console.Write(
"{0} ", e.users[i]);
                }
                Console.WriteLine();
                Console.WriteLine();
            }

        }

//class WorkNoticeObserver
public class SampleTest
        {
            
public static void Test()
            {
                List
<string> list1 = new List<string>();
                list1.Add(
"User1");
                list1.Add(
"User2");
                list1.Add(
"CTO");
                list1.Add(
"CEO");

                List

<string> list2 = new List<string>();
                list2.Add(
"User2");

                List

<string> list3 = new List<string>();
                list3.Add(
"User1");

                List

<string> list4 = new List<string>();
                list4.Add(
"CTO");
                list4.Add(
"CEO");

                WorkNoticeObserver wn 

= new WorkNoticeObserver();
                ProcessDataValidation p 
= new ProcessDataValidation();
                
//注册事件
                p.Begin += new WorkNoticeEventHandler(wn.NoticeUsersWhenProcessBegin);
                p.User1Validated 
+= new WorkNoticeEventHandler(wn.NoticeUsersWhenUser1Validated);
                p.User2Validated 
+= new WorkNoticeEventHandler(wn.NoticeUsersWhenUser2Validated);
                p.Finished 
+= new WorkNoticeEventHandler(wn.NoticeUsersWhenProcessFinished);//触发事件
                p.OnBegin(list1);
                p.OnUser1Validate(list2);
                p.OnUser2Validate(list3);
                p.OnFinish(list4);

                p 

= null;
                p 
= new ProcessDataValidate_NonNetSolution();
                
// 子类Begin事件的实现
                p.Begin += delegate(object sender, WorkNoticeEventArgs e) {
                    Console.Write(
"Notice:");
                    
for (int i = 0; i < e.users.Count; i++)
                    {
                        Console.Write(
"{0} ", e.users[i]);
                    }
                    Console.WriteLine();
                };

                p.OnBegin(list2);
            }

        }

//class SampleTest

    }
//namespace Delegate_And_Event
}