>Java >java지도 시간 >Java가 이벤트 중심 메커니즘을 구현하는 방법의 예

Java가 이벤트 중심 메커니즘을 구현하는 방법의 예

黄舟
黄舟원래의
2017-09-05 10:13:312252검색

이 글은 주로 Java를 사용한 이벤트 중심 메커니즘의 구현을 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 이를 여러분과 공유하고 참고용으로 제공하겠습니다. 편집기를 따라 살펴보겠습니다

프로젝트 요구 사항으로 인해 C#과 유사한 이벤트 및 위임 메커니즘을 구현할 수 있는 Java용 이벤트 기반 메커니즘을 지원하는 클래스 라이브러리 세트를 제공해야 합니다. 우리 모두 알고 있듯이 Java 언어 자체와 표준 라이브러리는 이벤트 중심 메커니즘에 대한 관련 인터페이스를 제공하지 않습니다. 단, Swing에는 관련 클래스가 있습니다(일반적으로 아무도 사용하지 않기 때문에 표준 라이브러리에 속한다고 생각하지 않습니다). :) 이벤트 처리를 구현하기 위해 이 메커니즘을 지원하지만 결국 GUI와 결합되어 다른 유형의 애플리케이션에서 사용하기에는 약간 어색하고 다양성이 부족한 것 같습니다. 그러므로 범용 자바 이벤트 기반 메커니즘 클래스 라이브러리를 구현한 후 이를 범용 자바 애플리케이션에 적용하는 작업이 필요한데, 이는 어렵지 않습니다. :)

먼저 C# 이벤트 기반 메커니즘 작성 방법을 살펴보겠습니다. C#에서 제공하는 이벤트 키워드를 이용하여 쉽게 이벤트를 정의한 후, 해당 이벤트에 이벤트 처리 함수를 추가하면(C#에서는 일반적으로 함수를 참조하기 위해 대리자를 사용함), 이벤트가 트리거됩니다. 함수는 이벤트 기반 프로세스입니다. 예를 들면 다음과 같습니다.


//定义事件和对应的委托
public event MyDelegate Click;
public delegate void MyDelegate();

//定义委托
void OnClick(){
  console.writeline("you just clicked me!");
}

//将委托与事件关联
Click += OnClick;

//触发事件
Click();

위 코드는 C#에서 구현된 이벤트 중심 메커니즘의 간단한 예입니다. 이는 C#이 언어 수준에서 제공하는 편의성 때문임을 알 수 있습니다. 실제로 CLR). 불행하게도 Java는 이러한 편리함을 제공하지 않으며 사람이 이를 구현해야 합니다. 다음 문서에서는 참조용으로만 이벤트 기반 메커니즘을 구현하는 두 가지 방법을 제공합니다.

관찰자 패턴

관찰자 패턴은 일반적으로 사용되는 디자인 패턴입니다. 관찰자는 먼저 관찰된 개체(주제)를 구독하므로 관찰된 개체(주제)에서 무언가 변경되면 관찰자에게 알림이 전달됩니다. 변화의.

이 디자인 패턴은 이벤트 중심 메커니즘에 사용될 수 있습니다. 이벤트는 관찰된 객체(주제)와 동일합니다. 이벤트가 트리거되면 이벤트 처리 함수(위임자)가 호출되는 것을 볼 수 있습니다. C#)은 관찰자로 볼 수 있습니다. 따라서 위의 기능은 다음과 같이 구현될 수 있다.


/*事件类*/
public Event {
  //与事件相关的事件处理函数
  public ArrayList<Callback> callbackList;
  
  //事件触发函数
  public void emit(){
    for(Callback cb : callbackList){
      cb.run();
    }
  }
  
  //注册事件处理函数
  public registerCallback(Callback cb){
    callbackList.add(cb);
  }
}

/*事件处理函数类*/
public interface Callback {
  void run();
}

public OnClick implements Callback {
  //函数
  public void run(){
    System.out.println("you just clicked me!");
  }
  
  
/*实现事件驱动*/
Event e = new Event(); 
//将OnClick事件处理函数注册到事件中
e.registerCallback(new OnClick()); 
//触发事件
e.emit();

위의 Java 코드는 간단한 이벤트 중심 메커니즘을 구현합니다. 원리는 매우 간단하며 관찰자 패턴의 일반적인 응용 사례입니다.

리플렉션 사용

Java 언어는 런타임에 클래스의 다양한 구성 요소(예: 클래스 이름, 클래스 멤버 함수, 클래스 속성 등)를 가져와서 작동할 수 있는 강력한 리플렉션 기능을 제공합니다. 아래에서는 리플렉션을 사용하여 간단한 이벤트 기반 메커니즘을 구현합니다.


/*事件处理类*/
public class EventHandler {
  //事件源
  private Object sender;
  //事件处理函数名称(用于反射)
  private String callback;
  
  public EventHandler(Object sender, String callback){
    this.sender = sender;
    this.callback = callback;
  }
  
  //事件触发
  public void emit(){
  Class senderType = this.sender.getClass();
  try {
    //获取并调用事件源sender的事件处理函数
    Method method = senderType.getMethod(this.callback);
    method.invoke(this.sender);
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}


/*事件源*/
public class Button(){
  /*可以在此设置Button类的相关属性,比如名字等*/
  private String name;
  ...
  
  
  //事件处理函数
  public void onClick(){
    System.out.println("you just clicked me!");
  }
}
  
  
/*实现事件驱动机制*/
Button b = new Button();
if(/*收到按钮点击信号*/){
  EventHandler e = new EventHandler(b, "onClick");
  e.emit();
}

위의 코드는 리플렉션을 사용하여 구현된 이벤트 기반 메커니즘을 보여줍니다. 리플렉션 메커니즘을 사용하면 확장성이 뛰어나다는 장점이 있습니다. 예를 들어 내 이벤트 처리 함수는 EventArgs 형식 매개변수를 도입할 수 있습니다. event 이벤트가 더 많은 정보를 전달할 수 있도록 매개변수가 있습니다. 다시 작성된 이벤트 처리 함수는 아래 코드와 같습니다.


public class EventArgs {
  //参数
  String p1;
  Integer p2;
  ...
  
}

//onClick事件处理函数改写
public void onClick(Object sender, EventArgs e){
  //参数e提供更多的信息
  System.out.println("Hello, you clicked me! " + e.p1 + e.p2);
}

//触发函数emit改写
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
  //获取并调用事件源sender的事件处理函数
  Method method = senderType.getMethod(this.callback, this.getClass(), e.getClass());
  method.invoke(this.sender, this.sender, e);
  } catch (Exception e2) {
    e2.printStackTrace();
  }
}

익숙하게 들리시나요? 그렇죠, C#으로 Winform 폼을 작성할 때 Visual Studio에서 자동으로 생성되는 이벤트 처리 함수(코드 내 onClick 함수)는 거의 동일한 폼을 가지고 있는데 이번에는 Java로 구현해 보겠습니다.

물론 위에서 언급한 Java의 이벤트 중심 메커니즘을 구현할 수 있는 두 가지 방법 외에도 Java의 내부 클래스를 사용하는 등의 다른 방법도 있습니다. 저자가 일부 샘플 코드도 작성했으므로 다루지는 않겠습니다. 더 이상 자세한 내용은 생략하고 나중에 저장하겠습니다.

위 내용은 Java가 이벤트 중심 메커니즘을 구현하는 방법의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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