まず、リスナーが何であるかを紹介しましょう。
リスナー - 保留中のインターフェイスを実装する通常のJavaプログラムです。このプログラムは、別のクラスのメソッド呼び出しをリッスンするために特別に使用されます。
これは、オブザーバーモードを使用しています。
オブザーバーモードとは:
オブジェクト間の1対多くの依存関係を定義します。オブジェクトの状態が変更されると、それに依存するすべてのオブジェクトは、自動的に更新するように通知されます。
例:
GUIプログラミングのaddxxxxlistenerはすべてオブザーバーモードです。
たとえば、リスニングイベントをボタンクリックに追加し、キーボードにリスニングイベントを追加します。
オブザーバーパターンの3つの重要なカテゴリ:
聴かれているイベントのソース、つまり私たちが使用しているオブジェクト。
登録されたリスナーは、現在使用されているオブジェクトを聴くために特別に使用されます。
イベントオブジェクトイベントは、聞くオブジェクトです!
まず、自分が書いたモニターのシンプルなバージョンを見てみましょう。
簡単なバージョン:
イベントソース、リスナー、テストクラスがあります。
イベントは次のフルバージョンに実装されます。
開発手順:
ステップ1:聞く必要があるクラスの人を実装します。
ステップ2:リスニングインターフェイスIpersonRunListenerを実装します。
ステップ3:直接のクラスでは、iPersonRunListenerクラスを登録するための1つの方法(または複数、ここで2つの方法を提供)を提供します。
ステップ4:IpersonRunListenerクラスのインスタンスは、人クラスで維持する必要があります。
ステップ5:person.runメソッドを呼び出すとき、ipersonrunlistenerがnullであるかどうか、およびそれがnullでない場合は、その戦闘方法を呼び出します。
ステップ6:デモクラスで、人をインスタンス化し、リスナーを登録します。
人:
パッケージcn.hncu.designpattern1; public class person {private string name; private ipersonrunlistenerリスナー1; private ipersonrunlistenerリスナー2;パブリックパーソン(文字列名){super(); this.name = name; } public void run(){if(ristener1!= null){ristens1.fighting(); } system.out.println(name+"run ..."); if(ristener2!= null){ristener2.fighting(); }} public void addbefore(ipersonrunlistenerリスナー){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 person = new Person( "Zhang San"); ipersonrunlistenerリスナー= new ipersonrunlistener(){@override public void fighting(){//出力だけでなく、イベントオブジェクトをまだ書いていないため、System.out.println( "最初に準備してください..."); }}; person.addbefore(リスナー); a a = new a(); person.addafter(a); person.run(); }} class a Ipersonrunlistener {@Override public void fighting(){//ここでできることはたくさんあります。 }}出力:
フルバージョンにイベントソースを追加します:
ここでは、イベントイベントオブジェクトが前のオブジェクトに追加されました。フルバージョンと見なされます。
開発手順:
ステップ1:前のページに基づいてpersoneventクラスを追加し続けます(イベントオブジェクトを表す、インターフェイスではなくクラスだと言ったことに注意してください)。
ステップ2:personeventオブジェクトに個人属性を追加して、イベントソースオブジェクトを識別します。
ステップ3:PersonListenerインターフェイスの戦闘方法を変更し、Personeventパラメーターを受信させます。
ステップ4:Person Class Run Methodでは、PersonListenerプロパティが空でないと判断された場合、戦闘方法は呼び出され、Personeventはインスタンス化され、戦闘方法は戦闘方法に渡されます。
ステップ5:メインメソッドでは、PersoneventのGetSourceメソッドを介して同じオブジェクトであるかどうかをテストします。
person.java
パッケージcn.hncu.designpattern2; public class person {private string name;プライベートIpersonRunListenerリスナー。パブリックパーソン(文字列名){super(); this.name = name; } public void run(){system.out.println(name+"start runn ..."); if(リスナー!= null){ristener.fighting(new personevent(this)); }} public void addPersonListener(ipersonrunlistenerリスナー){this.listener = listener; } public string getname(){return name; } @Override public String toString(){return "person [name =" + name + "、listerer =" + listerer + "]"; }}インターフェイスipersonrunlistener {public void fighting(personevent pe);} class personevent {person p = null; public personevent(person p){this.p = p; } public string getname(){return p.getname(); } public Object getSource(){return p; }} //インターフェイスの実装//共通のテンプレートを書き込むのに役立つ基本クラスを書くこともできます。このクラスを継承すると、書くのをやめることができます。 //異なる関数がある場合、このクラスをオーバーライドするために自分自身を書き込みますdefaultCatListenerはipersonrunlistener {@Override public void Fighting(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リスナー= new ipersonrunlistener(){@override public void fighting(personevent pe){system.out.println(pe.getsource()+"it reas run ..."); if(pe.getName()。equals( "Zhang San")){System.out.println(PE.getName()+"最初に実行..."); }}}}; p1.addpersonlistener(リスナー); p2.addpersonListener(リスナー); p1.run(); p2.run();人P3 =新しい人( "li si"); p3.addpersonListener(new DefaultCatListener()); p3.run(); }}デモの結果:
これらは基本原則です。イベントの出力を必要なアクションに変更すると、必要な関数を実現できます。リスナーを追加すると、実行方法の前後に呼び出す方法を呼び出して、やりたいアクションを実行できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。