>  기사  >  백엔드 개발  >  관찰자 패턴에 대한 C#의 지원 (2)

관찰자 패턴에 대한 C#의 지원 (2)

黄舟
黄舟원래의
2016-12-21 14:56:551177검색

.Net은 애플리케이션 이벤트에 대한 표준 패턴을 정의합니다. 우리는 애플리케이션 프로세스 중 이벤트 정의 규칙을 준수해야 합니다. 표준 이벤트 패턴에는 다음 네 가지 측면이 포함됩니다.

1. System.EventArgs 유형에서 상속된 이벤트 정보 클래스이며 이 클래스의 이름은 SendMailEventArgs와 같이 EventArgs로 끝납니다. 소스 이벤트 리스너에게 전송되는 메시지입니다. 이벤트 소스가 이벤트 리스너에 추가 정보를 전달할 필요가 없으면 EventArgs.Empty를 직접 사용할 수 있습니다. 이때 자체 이벤트 정보 클래스를 정의할 필요가 없습니다.

2. 이벤트를 정의할 때 사용되는 대리자(옵저버 패턴의 추상 주제 Subject 및 추상 관찰자 Observer와 유사) 이 대리자의 반환 유형은 void이고 첫 번째 매개변수 유형은 Object입니다. 두 번째는 System.EventArgs 또는 해당 하위 클래스입니다. 이름은 다음과 같이 EventHandler로 끝나야 합니다.

공용 대리자 void XxxEventHandler(object sender,SendMailEventArgs e);.net 프레임워크는 이벤트의 일반 대리자를 정의합니다. 사양

System.EventHandler(Object sender, TeventArgs e) where TeventArgs:EventArgs;

이렇게 하면 실제 애플리케이션에서 사용자 정의를 구현할 필요가 없습니다. Delegated, 이것을 직접 사용하여 일반 대리자는 애플리케이션 이벤트의 요구 사항을 충족할 수 있습니다.

3. 이벤트 구독자에게 알림을 보내는 이벤트 소스 클래스(옵저버 패턴의 특정 주제 ConcreteSubject와 유사) 이 클래스에는 이벤트 구독 및 취소 인터페이스를 외부에 제공하는 이벤트 멤버가 포함되어 있습니다. 모든 구독자에게 이 이벤트를 알리기 위해 이벤트를 발생시키는 역할을 담당하는 메서드입니다. 이 메서드는 On으로 시작하고 이벤트 이름으로 끝나며 System.Eventargs 유형을 허용하는 보호된 가상 메서드여야 합니다. (또는 하위 클래스) 매개변수. 예를 들어 이벤트 멤버를 정의합니다.

public event EventHandler SendMail;

이 메서드는 다음과 같아야 합니다.

PRotected virtual void OnSendMail(SendMailEventArgs e){} ;

외부 호출이나 입력을 원하는 이벤트로 변환하는 메서드도 있는데, 이를 트리거라고 부르겠습니다.

이 메서드는 이벤트 메시지 클래스 인스턴스화, 이벤트를 트리거하는 OnXxx 메서드 호출, 이벤트 메시지 인스턴스 전달을 담당합니다.

4. 이벤트 리스너 클래스(옵저버 패턴의 구체적인 옵저버 ConcreteObserver와 유사)는 이벤트 소스에서 보낸 메시지를 수신하는 데 사용됩니다. 형식은 다음과 같습니다. 반환 값은 void이고 두 개의 매개 변수가 있습니다. 첫 번째 매개 변수 유형은 Object이고 두 번째 매개 변수는 해당 이벤트 메시지 클래스입니다. 예: protected void Phone_SendMail(Object sender,EventArgs e)...;

다음은 이전 기사의 이메일 전송 시스템을 다시 작성합니다.

먼저 이벤트 메시지 클래스를 정의합니다. 장치에서 보낸 메시지에 보낸 메시지를 저장합니다.

클립보드 인쇄로 일반 복사본을 보시겠습니까?
public class SendMailEventArgs:EventArgs
{
//읽기 전용 정보 필드
public readonly string Message
public SendM ailEventArgs(string message; )
                                                                    읽기 전용 정보 필드
공개 읽기 전용 문자열 메시지 ;
공개 SendMailEventArgs(문자열 메시지)
this.Message = 메시지;
}
}

이벤트 소스 클래스.py를 클립보드 인쇄로?
클래스 MailManager 
                                                      {                >} get
{
Return New System.net.mail.Mailmessage ()
}
}
// .NET 프레임워크에서 의뢰한 일반 이벤트 정의
공개 이벤트 EventHandler SendMail;                                           (sendMail != null)
                                           
                                                                                                    🎜 > 공개 무효 SendToMail()
{                                                                                ! ");
}                                                                                  );
//이메일 정보 클래스의 제목을 사용하여 이벤트 인스턴스화                                                            >                                  >MailManager 클래스
{
//Mail
public System.Net.Mail.MailMessage MailMess
{
set
{
                    MailMess = value;              > get
{
새 시스템 반환 .Net.Mail.MailMessage();
}
}
//.net 프레임워크에서 제공하는 일반 대리자를 사용하여 이벤트 정의
public event EventHandler SendMail;
//이벤트 트리거를 담당하는 메서드
protected virtual void On SendMial (SENDMAILEVENTARGS E)
{
Eventhandler & LT; Sendmaileventargs & GT; Sendmail = Sendmail;
if (Sendmail! = NULL)
{
// 모든 구독자에게 알립니다. > SENDMAIL (this, E );
}
}
//외부 호출을 이벤트로 변환하는 역할
public void SendToMail()
if (String.IsNu llOrEmpty(MailMess.Subject) || 문자열 .IsNullOrEmpty(MailMess.Body))
                                                                          ~      . 🎜>            {
                                                                        ~                                    {0}", MailMess.Subject)를 통해;
//메일 제목을 사용하여 이벤트 정보 클래스를 인스턴스화합니다
SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject);
           //모든 이벤트 구독자에게 알림
This.OnSendMial(sendMailEventArgs);
}
}
}

이벤트 수신 class

클립보드 인쇄로 일반 복사를 보시겠습니까?
class MobilePhone
{
                                                      >                                        Public void SendMessage(object sender,SendMailEventArgs e)
{
콘솔 .WriteLine("RTX 메시지: {0}", e.Message);
} }

#endregion
} {
#region SendHandler 멤버

공개 무효 SendMessage(객체 발신자,SendMailEventArgs e)
{
Console.WriteLine("휴대폰 메시지: {0}", e.Message);
                                                                   회원

public void SendMessage(개체 발신자,SendMailEventArgs e)
{
Console.WriteLine( "RTX 메시지: {0}", e.Message); 🎜>        #endregion
                                                                                                                    Main(string[] args)                                                                     
mailManager.MailMess.Subject = "알림"
mailManager.MailMess.Body = "관찰자 모드 학습.";
mailManager.SendMail+=new MobilePhone().SendMessage;//휴대폰 알림 등록
mailManager.S endMail+=new RTX().SendMessage; //RTX 알림 등록                             ~    메일관리자( );
                                                                                              ~                                .



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.