事件(event)设计准则(二)

来源:互联网 发布:编程一小时怎么登陆 编辑:程序博客网 时间:2024/05/20 00:35

 

class PubEventArgs : EventArgs
    
{
        
private readonly string m_magazineName;
        
private readonly DateTime m_pubDate;
        
public PubEventArgs(string magazineName, DateTime pubDate)
        
{
            m_magazineName 
= magazineName;
            m_pubDate 
= pubDate;
        }

        
public string magazineName
        
{
            
get return m_magazineName; }
        }

        
public DateTime pubDate
        
{
            
get return m_pubDate; }
        }

    }

    
class Publisher
    
{
        
public delegate void PubComputerEventHandler(object sender,PubEventArgs e);//statement of the event for agents
        public delegate void PubLiftEventHandler(object sender, PubEventArgs e);
        
public event PubComputerEventHandler PubComputer;//event of statement
        public event PubLiftEventHandler PubLife;
        
protected virtual void OnPubComputer(PubEventArgs e)
        
{
            PubComputerEventHandler handler 
= PubComputer;
                
if(handler!=null)
                
{
                    handler(
this, e);
                }

        }

        
protected virtual void OnPubLife(PubEventArgs e)
        
{
            PubLiftEventHandler handler 
= PubLife;
            
if (handler != null)
            
{
                handler(
this, e);
            }

        }

        
public void issueComputer(string magazineName,DateTime pubDate)//method of trigger event
        {
            Console.WriteLine(
"issue "+magazineName);
            OnPubComputer(
new PubEventArgs(magazineName, pubDate));
        }

        
public void issueLife(string magaineName,DateTime pubDate)
        
{
            Console.WriteLine(
"issue " + magaineName);
            OnPubLife(
new PubEventArgs(magaineName, pubDate));
        }

    }

    
class Subscriber
    
{
        
private string name;
        
public Subscriber(string name)
        
{
            
this.name = name;
        }

        
public void Reveive(object sender ,PubEventArgs e)//define in the event subscribers procedure of handing event
        {
            Console.WriteLine(e.pubDate
+" "+name + " have already received " + e.magazineName);
        }

    }

    
class EventTest
    
{
        
static void Main()
        
{
            Publisher pub 
= new Publisher();
            Subscriber sam 
= new Subscriber("Sam");
            pub.PubComputer 
+= new Publisher.PubComputerEventHandler(sam.Reveive);//Subscriber to the event issuers an event
            Subscriber Jone = new Subscriber("Jone");
            pub.PubComputer 
+= new Publisher.PubComputerEventHandler(Jone.Reveive);
            pub.PubLife 
+= new Publisher.PubLiftEventHandler(Jone.Reveive);
            pub.issueComputer(
"computer magazine",Convert.ToDateTime("2006-1-1"));//trigger event
            pub.issueLife("Life magazine", Convert.ToDateTime("2006-1-1"));
            Console.WriteLine();
            Console.WriteLine(
"one year ago");
            pub.PubComputer 
-= new Publisher.PubComputerEventHandler(Jone.Reveive);
            pub.issueComputer(
"computer magazine", Convert.ToDateTime("2007-1-1"));
            pub.issueLife(
"Life magazine", Convert.ToDateTime("2007-1-1"));
        }

    }

一个程序用两种方式写

没有按准则写

     class Publisher
    
{
        
public delegate void PubComputer(string magazineName);//statement of the event for agents
        public delegate void PubLift(string magazineName);
        
public event PubComputer OnPubComputer;//event of statement
        public event PubLift OnPubLife;
        
public void issueComputer()//method of trigger event
        {
            
if (OnPubComputer != null)
            
{
                Console.WriteLine(
"issue <<Programs>> magazine");
                OnPubComputer(
"Computer magazine");
            }

        }

        
public void issueLife()
        
{
            
if (OnPubLife != null)
            
{
                Console.WriteLine(
"issue <<Life>> magazine");
                OnPubLife(
"Life magazine");
            }

        }

    }

    
class Subscriber
    
{
        
private string name;
        
public Subscriber(string name)
        
{
            
this.name = name;
        }

        
public void Reveive(string magazineName)//define in the event subscribers procedure of handing event
        {
            Console.WriteLine(name
+" have already received "+magazineName);
        }

    }

    
class EventTest
    
{
        
static void Main()
        
{
            Publisher pub 
= new Publisher();
            Subscriber sam 
= new Subscriber("Sam");
            pub.OnPubComputer 
+= new Publisher.PubComputer(sam.Reveive);//Subscriber to the event issuers an event
            Subscriber Jone = new Subscriber("Jone");
            pub.OnPubComputer 
+= new Publisher.PubComputer(Jone.Reveive);
            pub.OnPubLife 
+= new Publisher.PubLift(Jone.Reveive);
            pub.issueComputer();
//trigger event
            pub.issueLife();
            Console.WriteLine();
                Console.WriteLine(
"one year ago");
                pub.OnPubComputer 
-= new Publisher.PubComputer(Jone.Reveive);
                pub.issueComputer();
                pub.issueLife();
        }

    }

按准则写: