JavaWeb監聽器Listener實例解析。本站提示廣大學習愛好者:(JavaWeb監聽器Listener實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb監聽器Listener實例解析正文
起首來引見一下甚麼是監聽器:
監聽器-就是一個完成待定接口的通俗Java法式,此法式專門用於監聽別的一個類的辦法挪用。
這是應用不雅察者形式的。
甚麼是不雅察者形式:
界說對象間一對多的依附關系,當一個對象的狀況產生轉變時,一切依附於它的對象都獲得告訴主動更新。
示例:
GUI編程中的addXxxxListener都是不雅察者形式。
好比為按鈕點擊添加監聽事宜,為鍵盤添加監聽等等…
不雅察者形式的三個主要類:
被監聽的事宜源,也就是我們在應用的對象。
注冊的誰人監聽器,是專門用來監聽以後應用的對象的。
事宜對象Event也就是被監聽的誰人對象!
我們先來看一個簡略版的,本身寫的監聽器。
簡略版:
有事宜源,和監聽器,測試類.
Event等下一個完全版完成.
開辟步調:
第一步:完成一個須要被監聽的類Person.
第二步:完成一個監聽接口IPersonRunListener。
第三步:在Person類中,供給一個辦法(或許多個,我在這裡供給了2個辦法)用於注冊IPersonRunListener類,即addBefore和addAfter
第四步:必需要在Person類中保護IPersonRunListener類的實例。
第五步:在挪用person.run辦法時,斷定IPersonRunListener能否為null,假如不為null則挪用它的fighting辦法。
第六步:在Demo類中,實例化Person,並注冊一個監聽。
Person:
package cn.hncu.designPattern1;
public class Person {
private String name;
private IPersonRunListener listener1;
private IPersonRunListener listener2;
public Person(String name) {
super();
this.name = name;
}
public void run(){
if(listener1!=null){
listener1.fighting();
}
System.out.println(name+"正在跑...");
if(listener2!=null){
listener2.fighting();
}
}
public void addBefore(IPersonRunListener listener){
this.listener1=listener;
}
public void addAfter(IPersonRunListener listener){
this.listener2=listener;
}
}
interface IPersonRunListener{
public void fighting();
}
Demo
package cn.hncu.designPattern1;
public class Demo {
public static void main(String[] args) {
Person person = new Person("張三");
IPersonRunListener listener = new IPersonRunListener() {
@Override
public void fighting() {
//這裡可以做許多事,不是只能輸入哦
//不外因為還沒寫Event對象,所以拿不到是誰挪用的
System.out.println("先做好預備任務...");
}
};
person.addBefore(listener);
A a = new A();
person.addAfter(a);
person.run();
}
}
class A implements IPersonRunListener{
@Override
public void fighting() {
//這裡可以做許多事,不是只能輸入哦
//不外因為還沒寫Event對象,所以拿不到是誰挪用的
System.out.println("跑完了,歇息歇息...");
}
}
輸入:
完全版–添加事宜源:
在這裡絕對後面的增長了一個Event-事宜對象.算是完全版的了。
開辟步調:
第一步:在前頁的基本上持續添加一個PersonEvent類(留意我說是類不是接口),代表事宜對像。
第二步:給PersonEvent對像,添加一個Person屬性,用以標識事宜源對像。
第三步:修正PersonListener接口的fighting辦法,讓它吸收一個PersonEvent參數。
第四步:在Person類run辦法中,假如斷定PersonListener屬性不為空,則在挪用fighting辦法,實例化PersonEvent並傳給fighting辦法。
第五步:在main辦法中,經由過程PersonEvent的getSource辦法測試能否是統一個對像。
Person.java
package cn.hncu.designPattern2;
public class Person {
private String name;
private IPersonRunListener listener;
public Person(String name) {
super();
this.name = name;
}
public void run(){
System.out.println(name+"開端跑了..");
if(listener!=null){
listener.fighting(new PersonEvent(this));
}
}
public void addPersonListener(IPersonRunListener listener){
this.listener=listener;
}
public String getName(){
return name;
}
@Override
public String toString() {
return "Person [name=" + name + ", listener=" + listener + "]";
}
}
interface 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;
}
}
//我們還可以寫一個幫我們完成了接口的根本類
//外面寫我們通用的模板,假如我們繼續這個類,我們便可以不寫了。
//有功效紛歧樣的處所,我們就本身寫,籠罩這個類的辦法
class DefaultCatListener implements IPersonRunListener {
@Override
public void fighting(PersonEvent pe) {
System.out.println("默許的舉措...");
}
}
Demo.java
package cn.hncu.designPattern2;
public class Demo {
public static void main(String[] args) {
Person p1 = new Person("張三");
Person p2 = new Person("Jack");
IPersonRunListener listener = new IPersonRunListener() {
@Override
public void fighting(PersonEvent pe) {
System.out.println(pe.getSource()+"曾經跑完了...");
if(pe.getName().equals("張三")){
System.out.println(pe.getName()+"跑到了第一位...");
}
}
};
p1.addPersonListener(listener);
p2.addPersonListener(listener);
p1.run();
p2.run();
Person p3 = new Person("李四");
p3.addPersonListener(new DefaultCatListener());
p3.run();
}
}
演示成果:
根本上的道理就是這些了,外面事宜的輸入你換成你須要的舉措便可以完成你想要的功效,添加一個監聽,便可以在run辦法之前或許以後挪用本身想要挪用的辦法,做本身想做的舉措!
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。