最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之監(jiān)聽器模式實例詳解

 更新時間:2018年02月18日 10:06:50   作者:Jenkov  
這篇文章主要介紹了Java設計模式之監(jiān)聽器模式,結合實例形式較為詳細的分析了java設計模式中監(jiān)聽器模式的概念、原理及相關實現(xiàn)與使用技巧,需要的朋友可以參考下

本文實例講述了Java設計模式之監(jiān)聽器模式。分享給大家供大家參考,具體如下:

監(jiān)聽器模式有三個要素——事件源、事件對象、監(jiān)聽器。

事件源:顧名思義,事件發(fā)生的源頭,比如點擊的按鈕,屬于被監(jiān)聽的對象;
事件對象:這個經常和事件源混淆,它經常被用來包裝事件源,切記,它畢竟是個事件,比如點擊事件,和事件源的區(qū)別自己感受,木有栗子;
監(jiān)聽器:這個是監(jiān)聽器模式的核心,定義事件發(fā)生后的動作,通常事件對象作為監(jiān)聽器中定義的函數(shù)入?yún)ⅰ?/p>

下面舉個簡單的栗子:

故事背景是,小明是個不講衛(wèi)生的孩子,他媽媽很擔心他的健康,規(guī)定必須飯前洗手。

定義一個熊孩子。熊孩子就是被監(jiān)聽的對象,是事件源,一切事件都是事件源發(fā)出,這似乎是句廢話。

public class Child {
  private String name;
  private RemindListener remindListener;
  public Child(String name){
    this.name = name;
  }
  public void eat() {
    if(null!=remindListener){
      remindListener.remind(new RemindWashingHandsEvent(this));
    }
    System.out.println("Child eat...");
  }
  public void addListener(RemindListener listener){
    remindListener = listener;
  }
}

接下來是看看事件對象,事件對象正如上面所述,包裝了事件源。我們在這里定義一個飯前洗手事件。

public class RemindWashingHandsEvent {
  private Child child;
  public RemindWashingHandsEvent(Child child){
    this.child = child;
  }
}

事件對象定義了事件的屬性、狀態(tài)。
緊接著是定義事件發(fā)生后,監(jiān)聽器的動作,在這里是提醒洗手。

public class RemindListener {
  public void remind(RemindWashingHandsEvent remindWashingHandsEvent){
    System.out.println("listen to mom, washing hands before eating...");
  }
}

注意,監(jiān)聽器主要封裝了動作,僅此而已。

以上代碼,只是為了說明監(jiān)聽器模式原理,代碼通俗,不太優(yōu)雅。

下面繼承或實現(xiàn)java標準庫,又隨手寫了一對代碼,夜深了,有時間再解釋。

public class Kid{
  private String name;
  private List<Listener> liteners;
  public Kid(String name) {
    this.name = name;
    this.liteners = Lists.newArrayList();
  }
  public void eat(){
    for(Listener listener:liteners){
      if(listener instanceof WashingHandsListener){
        WashingHandsListener washingHandsListener = (WashingHandsListener) listener;
        washingHandsListener.fireAfterEventInvoked(new WashingHandsEvent(this,"洗手"));
      }
    }
    System.out.println("吃飯...");
  }
  public void addListener(Listener listener){
    liteners.add(listener);
  }
}
public class Event extends EventObject {
  /**
   * Constructs a prototypical Event.
   *
   * @param source The object on which the Event initially occurred.
   * @throws IllegalArgumentException if source is null.
   */
  public Event(Object source) {
    super(source);
  }
}
public class WashingHandsEvent extends Event{
  private String eventName;
  /**
   * Constructs a prototypical Event.
   *
   * @param source The object on which the Event initially occurred.
   * @throws IllegalArgumentException if source is null.
   */
  public WashingHandsEvent(Object source,String eventName) {
    super(source);
    this.eventName = eventName;
  }
  public String getEventName() {
    return eventName;
  }
  public void setEventName(String eventName) {
    this.eventName = eventName;
  }
}
public interface Listener extends java.util.EventListener{
  public void fireAfterEventInvoked(Event event);
}
public class WashingHandsListener implements Listener{
  @Override
  public void fireAfterEventInvoked(Event event) {
    WashingHandsEvent washingHandsEvent = (WashingHandsEvent) event;
    System.out.println("飯前準備"+ washingHandsEvent.getEventName());
  }
}
public class Test {
  public static void main(String[] args) {
    Kid xiaoming = new Kid("xiaoming");
    xiaoming.addListener(new WashingHandsListener());
    xiaoming.eat();
  }
}

輸出結果:

更多java相關內容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • Java servlet后端開發(fā)超詳細教程

    Java servlet后端開發(fā)超詳細教程

    Servlet指在服務器端執(zhí)行的一段Java代碼,可以接收用戶的請求和返回給用戶響應結果,下面這篇文章主要給大家介紹了關于Java.servlet生命周期的相關資料,需要的朋友可以參考下
    2023-02-02
  • Java創(chuàng)建多線程的幾種方式實現(xiàn)

    Java創(chuàng)建多線程的幾種方式實現(xiàn)

    這篇文章主要介紹了Java創(chuàng)建多線程的幾種方式實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • IDEA中查看類繼承圖和類源碼的騷操作

    IDEA中查看類繼承圖和類源碼的騷操作

    這篇文章主要介紹了IDEA中查看類繼承圖和類源碼的騷操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Idea里github的圖形化操作配置方法

    Idea里github的圖形化操作配置方法

    這篇文章主要介紹了Idea里github的圖形化操作配置方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • java?百度手寫文字識別接口配置代碼

    java?百度手寫文字識別接口配置代碼

    本文通過實例代碼給大家介紹了java?百度手寫文字識別接口配置方法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-01-01
  • SpringBoot使用AOP實現(xiàn)統(tǒng)計全局接口訪問次數(shù)詳解

    SpringBoot使用AOP實現(xiàn)統(tǒng)計全局接口訪問次數(shù)詳解

    這篇文章主要介紹了SpringBoot通過AOP實現(xiàn)對全局接口訪問次數(shù)的統(tǒng)計,文章從相關問題展開全文內容詳情,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • 深入了解JAVA 虛引用

    深入了解JAVA 虛引用

    這篇文章主要介紹了JAVA 虛引用的相關資料,幫助大家更好的理解和學習JAVA,感興趣的朋友可以了解下
    2020-08-08
  • Java程序執(zhí)行過程及內存機制詳解

    Java程序執(zhí)行過程及內存機制詳解

    本講將介紹Java代碼是如何一步步運行起來的,還會介紹Java程序所占用的內存是被如何管理的:堆、棧和方法區(qū)都各自負責存儲哪些內容,感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • 用命令行編譯java并生成可執(zhí)行的jar包方法

    用命令行編譯java并生成可執(zhí)行的jar包方法

    下面小編就為大家分享一篇用命令行編譯java并生成可執(zhí)行的jar包方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • IDEA啟動tomcat項目報錯53820 socket closed問題及解決

    IDEA啟動tomcat項目報錯53820 socket closed問題及解決

    IDEA啟動Tomcat項目時報錯,原因是IDEA關閉時Tomcat未正常關閉,導致端口被占用,解決方法是通過任務管理器關閉占用高內存的Java進程,通常是IDEA進程下面的,或者使用命令行找到PID并強制終止進程
    2024-12-12

最新評論

开远市| 桂阳县| 淮滨县| 平原县| 体育| 惠安县| 历史| 错那县| 互助| 武强县| 广南县| 崇阳县| 阿拉善左旗| 河源市| 安丘市| 逊克县| 台安县| 望谟县| 汝州市| 苏尼特左旗| 赞皇县| 申扎县| 霍林郭勒市| 增城市| 那坡县| 于田县| 宁安市| 湖口县| 会东县| 交城县| 上犹县| 甘南县| 青冈县| 高邑县| 马关县| 兴安县| 新闻| 呼玛县| 泾源县| 普陀区| 临夏县|