먼저 청취자가 무엇인지 소개하겠습니다.
리스너 - 보류중인 인터페이스를 구현하는 일반적인 Java 프로그램입니다. 이 프로그램은 특별히 다른 클래스의 메소드 호출을 듣는 데 사용됩니다.
관찰자 모드를 사용하고 있습니다.
관찰자 모드 란 :
객체 사이의 일대일 의존성을 정의합니다. 객체 상태가 변경되면 이에 의존하는 모든 객체에 자동으로 업데이트되도록 알립니다.
예:
GUI 프로그래밍의 addxxxxlistener는 모두 관찰자 모드입니다.
예를 들어, 버튼 클릭에 청취 이벤트 추가, 키보드에 청취 이벤트 추가 등
관찰자 패턴의 세 가지 중요한 범주 :
이벤트의 출처, 즉 우리가 사용하는 객체입니다.
등록 된 리스너는 현재 사용되는 객체를 듣는 데 특별히 사용됩니다.
이벤트 객체 이벤트는 듣는 객체입니다!
먼저 직접 작성된 모니터의 간단한 버전을 살펴 보겠습니다.
간단한 버전 :
이벤트 소스, 청취자 및 테스트 수업이 있습니다.
이벤트는 다음 정식 버전으로 구현됩니다.
개발 단계 :
1 단계 : 들어야하는 수업자를 구현하십시오.
2 단계 : 청취 인터페이스 IpersonRunlistener를 구현하십시오.
3 단계 : 개인 클래스에서 iPersonRunlistener 클래스 등록, 즉 Addbefore 및 AddAfter 등록을위한 하나의 방법 (또는 여러 가지 방법을 제공합니다)을 제공합니다.
4 단계 : iPersonRunlistener 클래스의 인스턴스는 개인 클래스에서 유지해야합니다.
5 단계 : Person.run 메소드를 호출 할 때 iPersonRunListener가 NULL인지 확인하고 NULL이 아닌 경우 전투 방법을 호출하십시오.
6 단계 : 데모 클래스에서 인스턴스턴스를하고 청취자를 등록하십시오.
사람:
패키지 cn.hncu.designpattern1; public class person {개인 문자열 이름; 개인 iPersonRunlistener LEASER1; 개인 iPersonRunlistener Learger2; 공개 사람 (문자열 이름) {super (); this.name = 이름; } public void run () {if (LeaterEner1! = null) {Listener1.fighting (); } system.out.println (이름+"run ..."); if (LeaterEr2! = null) {Leater2.Fighting (); }} public void Addbefore (iPersonRunListener Listener) {this.listener1 = 리스너; } public void addAfter (iPersonRunListener 리스너) {this.listener2 = 리스너; }} 인터페이스 iPersonRunListener {public void fighting ();}데모
패키지 cn.hncu.designpattern1; public class demo {public static void main (String [] args) {person perient = new Person ( "Zhang San"); iPersonRunlistener Listener = New IpersonRunListener () {@override public void fighting () {// 여기에서 할 수있는 일이 많이 있습니다. 그러나 아직 이벤트 객체를 작성하지 않았기 때문에 System.out.println ( "먼저 준비해야합니다 ..."); }}; person.addbefore (청취자); A a = 새로운 a (); person.addafter (a); person.run (); }} 클래스 A는 iPersonRunListener {@override public void fighting () {// 여기에서 할 수있는 일이 많이 있습니다. 그러나 아직 이벤트 객체를 작성하지 않았기 때문에 System.out.println이 누구인지 ( "RUN, REST ..."); }}산출:
정식 버전에서 이벤트 소스 추가 :
여기에서는 이벤트 이벤트 객체가 이전 객체에 추가되었습니다. 정식 버전으로 간주됩니다.
개발 단계 :
1 단계 : 이전 페이지를 기반으로 Personevent 클래스를 계속 추가하십시오 (이벤트 객체를 나타내는 인터페이스가 아닌 클래스라고 말했습니다).
2 단계 : 이벤트 소스 객체를 식별하기 위해 Personevent 객체에 사람 속성을 추가하십시오.
3 단계 : PersonListener 인터페이스의 전투 방법을 수정하고 Personevent 매개 변수를 받도록하십시오.
4 단계 : 개인 클래스 실행 방법에서, 개인 리스트너 속성이 비어 있지 않다고 판단되면, 전투 방법을 호출하고, 페르소 투어가 인스턴스화되고 전투 방법이 전투 방법으로 전달됩니다.
5 단계 : 주요 방법에서, GetSource의 getSource 방법을 통해 동일한 객체인지 테스트하십시오.
사람. 자바
패키지 cn.hncu.designpattern2; public class person {개인 문자열 이름; 개인 iPersonRunlistener 리스너; 공개 사람 (문자열 이름) {super (); this.name = 이름; } public void run () {System.out.println (이름+"시작 시작 ..."); if (Listener! = null) {Listener.fighting (new personevent (this)); }} public void addpersonListener (iPersonRunlistener 리스너) {this.listener = 리스너; } public String getName () {return name; } @Override public String toString () {return "person [name =" + name + ", liarder =" + listener + "]; }} 인터페이스 iPersonRunListener {public void Fighting (personevent pe);} class personevent {person p = null; 공개 personevent (Person P) {this.p = p; } public String getName () {return p.getName (); } public object getSource () {return p; }} // 인터페이스를 구현하는 데 도움이되는 기본 클래스를 작성할 수도 있습니다. // 공통 템플릿을 작성합니다. 이 수업을 물려 받으면 글쓰기를 중단 할 수 있습니다. // 다른 함수가있는 경우, 우리는이 클래스 클래스를 무시하기 위해 스스로 작성합니다. defaultCatlistener는 iPersonRunListener {@Override public void gight (personevent pe) {System.out.println ( "Default Action ..."); }}Demo.java
패키지 cn.hncu.designpattern2; public class demo {public static void main (String [] args) {person p1 = new Person ( "Zhang San"); 사람 P2 = 새로운 사람 ( "잭"); iPersonRunListener Listener = New IpersonRunListener () {@Override Public Void Fighting (Personevent PE) {System.out.println (Pe.getSource ()+"It it run ..."); if (pe.getName (). Equals ( "Zhang San")) {System.out.println (pe.getName ()+"첫 번째 장소로 실행 ..."); }}}}; p1.addpersonlistener (리스너); p2.addpersonListener (리스너); p1.run (); p2.run (); Person P3 = 새로운 사람 ( "li si"); p3.addpersonListener (새로운 defaultCatListener ()); p3.run (); }}데모 결과 :
이것이 기본 원칙입니다. 이벤트 출력을 필요한 작업으로 변경하면 원하는 기능을 실현할 수 있습니다. 리스너를 추가하면 실행 방법 전후에 호출하려는 메소드를 호출하고 원하는 작업을 수행 할 수 있습니다!
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.