程序设计: 猫叫一声,所有的老鼠都开始逃跑,主人被惊醒 问题解决


<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)
2、定义一个委托类型,用于指定事件触发时被调用的方法类型
3、定义一个事件成员
4、定义一个受保护的虚方法,负责通知事件的登记对象
5、定义一个方法,将输入转化为期望的事件

public   class  MailManager
    
{
        
//1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)

        
public class MailMsgEvernArgs : EventArgs
        
{
            
public MailMsgEvernArgs( string from,string to,string subject,string body)
            
{
                
this.from = from;
                
this.to = to;
                
this.subject = subject;
                
this.body = body;
                
            }

            
public readonly string from,to,subject,body;
        
        }


        
//2、定义一个委托类型,用于指定事件触发时被调用的方法类型

        
public delegate void MailMsgEventHandler(object sender,MailMsgEvernArgs args);

        
//3、定义一个事件成员

        
public event MailMsgEventHandler MailMsg;

        
//4、定义一个受保护的虚方法,负责通知事件的登记对象

        
protected virtual void OnMailMsg(MailMsgEvernArgs e)
        
{
            
if(MailMsg!=null)
                MailMsg(
this,e);
        }

        
//5、定义一个方法,将输入转化为期望的事件
        public void SimulateArrivingMsg(string from,string to,string subject,string body)
        
{
            MailMsgEvernArgs e 
= new MailMsgEvernArgs(from,to,subject,body);
            OnMailMsg(e);
        }

    }

注册事件:

static   void  Main( string [] args)
        
{
                  MailManager mm 
= new MailManager();
            mm.MailMsg 
+= new MailManager.MailMsgEventHandler(mm_MailMsg);
            mm.SimulateArrivingMsg(
"中国""美国""subject""body");
        }

 
private   static   void  mm_MailMsg( object  sender, MailManager.MailMsgEvernArgs args)
        
{

            Console.WriteLine(args.from);
            Console.WriteLine(args.to);
        }

事件练习

 

1、程序设计: 猫叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
 
要求: 1.要有联动性,老鼠和主人的行为是被动的。
 2.考虑可扩展性,猫的叫声可能引起其他联动效应。

 

public   class  CryArgs : EventArgs
    
{
        
public readonly string Name;
        
public CryArgs(string name)
        
{
            
this.Name = name;
        }

    }

    
public   delegate   void  SubEventHandler( object  sender,CryArgs cryArgs); 
    
    
public    class  Subject 
    

        
public event SubEventHandler SubEvent; 
        
protected virtual void FireAway(CryArgs cryArgs) 
        

            
if (this.SubEvent != null
                
this.SubEvent(this,cryArgs); 
        }
   

    }
 
    
public   class  Cat : Subject 
    
{
        
private string name;
        
public Cat(string name)
        
{
            
this.name = name;
        }

        
public void Cry() 
        
{
            CryArgs cryArgs 
= new CryArgs(name);
            
//Console.WriteLine("cat cryed."); 
            this.FireAway(cryArgs); 
        }
 
    }
 
    
public   abstract   class  Observer 
    

        
public Observer(Subject sub) 
        

            sub.SubEvent 
+= new SubEventHandler(Response); 
        }
 
        
public abstract void Response(object sender,CryArgs cryArgs);    
    }
 
    
public   class  Mouse : Observer 
    

        
private string name; 
        
public Mouse(string name, Subject sub) : base(sub) 
        
{   
            
this.name = name; 
        }

        
public override void Response(object sender, CryArgs cryArgs) 
        

            Console.WriteLine(cryArgs.Name
+"叫,"+name + " attempt to escape!"); 
        }
 
    }
 
    
public   class  Master : Observer 
    

        
public Master(Subject sub) : base(sub){}
        
public override void Response(object sender, CryArgs cryArgs) 
        
{
            Console.WriteLine(cryArgs.Name 
+ "叫," + "host waken"); 
        }
 
    }
 

注册事件

 

static   void  Main( string [] args)
        
{
            Cat c 
= new Cat("laomao");
            Mouse mouse 
= new Mouse("haozi", c);
            
            Master master 
= new Master(c);
            c.Cry();
         }
 
观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够得到通知并自动更新。在观察者模式中,有两个主要角色:观察者和目标。 观察者模式的类图如下所示: ``` +-------------------+ +-------------------+ | Subject | | Observer | +-------------------+ +-------------------+ | | | | | + attach(observer: Observer) | | | + detach(observer: Observer) | | | + notify() | | + update() | | | | | +-------------------+ +-------------------+ ▲ ▲ | | | | +-------------------+ +-------------------+ | ConcreteSubject | | ConcreteObserver | +-------------------+ +-------------------+ | | | | | | | | +-------------------+ +-------------------+ ``` 在这个类图中,Subject是目标类,它维护了一个观察者列表,并提供了方法来添加、删除和通知观察者。Observer是观察者接口,定义了一个update()方法,用于接收目标的通知。ConcreteSubject是具体的目标类,它实现了Subject接口,并在状态发生改变时通知观察者。ConcreteObserver是具体的观察者类,它实现了Observer接口,并在接收到通知时更新自己的状态。 根据你提供的引用内容,观察者模式可以应用于猫大叫一声老鼠逃跑主人惊醒的场景中。具体的类图如下所示: ``` +-------------------+ +-------------------+ | Cat | | Mouse | +-------------------+ +-------------------+ | | | | | + meow() | | + run() | | | | | +-------------------+ +-------------------+ ▲ ▲ | | | | +-------------------+ +-------------------+ | Owner | | AlarmClock | +-------------------+ +-------------------+ | | | | | + wakeUp() | | + ring() | | | | | +-------------------+ +-------------------+ ``` 在这个类图中,Cat是目标类,它有一个meow()方法用于猫大叫一声。Mouse和Owner是观察者类,它们分别有一个run()方法和wakeUp()方法,用于老鼠逃跑主人惊醒。AlarmClock是另一个观察者类,它有一个ring()方法,用于响起闹钟。 当Cat调用meow()方法时,它会通知所有的观察者,即Mouse、Owner和AlarmClock,它们分别执行自己的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值