本文介紹了JAVA事件模式的PHP實現(xiàn)。在我以前的文章里,我概括了系統(tǒng)事件定義和使用call_user_func()函數建立php 事件模塊的例子。本文通過引入高級的基于sender/eventObject/listener的php事件模塊對這個科目進行了擴展。
下面是一個JAVA 事件系統(tǒng)的例子。這個例子基于Apache小組 開發(fā)的,來源于Apache.org并進行了重新縮短和重頂格式后的ProtocolCommandSupport.java, ProtocolCommandListener.java and ProtocolCommandEvent.java文件。ProtocolCommandSupport.java文件包含了事件創(chuàng)建類,類的實例由系統(tǒng)創(chuàng)建,當系統(tǒng)被實例調用時,就就會創(chuàng)建該事件。事實上這個類看上去就像包含了一個監(jiān)聽器---類監(jiān)聽到事件創(chuàng)建并且在事件創(chuàng)建被通知時進行反應。注意"addProtocolCommandListener" and "removeProtocolCommandListener"方法,他們用于附加和分離監(jiān)聽。另外2個方法fireCommandSent" and "fireReplyReceived",召喚了對象"__listeners"容器儲存的方法。該容器實際上,只積累了ProtocolCommandListener 對象,因為只有該對象在調用addProtocolCommandListener" and "removeProtocolCommandListener"方法時能夠被通過。
以下為引用的內容: ProtocolCommandSupport.java public class ProtocolCommandSupport implements Serializable { private Object __source; private ListenerList __listeners = new ListenerList();
__source = source; } /*** * Fires a ProtocolCommandEvent signalling the sending of a command to all * registered listeners. ***/ public void fireCommandSent(String command, String message) { Enumeration en = __listeners.getListeners(); ProtocolCommandEvent event = new ProtocolCommandEvent(__source, command, message); ProtocolCommandListener listener; while (en.hasMoreElements()) { listener = (ProtocolCommandListener)en.nextElement(); listener.protocolCommandSent(event); } } /*** * Fires a ProtocolCommandEvent signalling the reception of a command reply * to all registered listeners. ***/ public void fireReplyReceived(int replyCode, String message) { Enumeration en = __listeners.getListeners(); ProtocolCommandEvent event = new ProtocolCommandEvent(__source, replyCode, message); ProtocolCommandListener listener; while (en.hasMoreElements()) { listener = (ProtocolCommandListener)en.nextElement(); listener.protocolReplyReceived(event); } } public void addProtocolCommandListener(ProtocolCommandListener listener) { } public void removeProtocolCommandListener(ProtocolCommandListener listener) { __listeners.removeListener(listener); } } |
ProtocolCommandListener.java 包含了監(jiān)聽器接口。其后的含義是任何將要由ProtocolCommandSupport類認證的事件將要提供這個能夠實現(xiàn)一個足夠被事件認證接口。這就可能造成了一個新的種類,2個或更多不同的類被事件認證,因為一個類能夠實現(xiàn)多重接口。
ProtocolCommandListener.java
public interface ProtocolCommandListener extends EventListener {
以下為引用的內容: /*** * This method is invoked by a ProtocolCommandEvent source after * sending a protocol command to a server. * * @param event The ProtocolCommandEvent fired. ***/ public void protocolCommandSent(ProtocolCommandEvent event); /*** * This method is invoked by a ProtocolCommandEvent source after * receiving a reply from a server. * * @param event The ProtocolCommandEvent fired. ***/ public void protocolReplyReceived(ProtocolCommandEvent event); } |
本文的最后一個文件是ProtocolCommandEvent.java。這個文件包含了一個EventObject 類中的叫做ProtocolCommandEvent的子集。EventObject的子集用于通過從event producer到event listeners的事件數據。ProtocolCommandEvent 類增加了一個定義在EventObject中的getSource()方法,創(chuàng)建了creates the getMessage(), isReply(), isCommand(), getReplyCode() and getCommand()方法。這些方法只能返回給類一個只讀字段,只能在構造函數中設置。
以下為引用的內容: ProtocolCommandEvent.java public class ProtocolCommandEvent extends EventObject { private int __replyCode; private boolean __isCommand; private String __message, __command;
super(source); __replyCode = 0; __message = message; __isCommand = true; __command = command; } public ProtocolCommandEvent(Object source, int replyCode, String message) { super(source); __replyCode = replyCode; __message = message; __isCommand = false; __command = null; } public String getCommand() { return __command; } public int getReplyCode() { return __replyCode; } public boolean isCommand() { return __isCommand; } public boolean isReply() { return !isCommand(); } public String getMessage() { return __message; } } |
?這3個文件組,只是JAVA事件系統(tǒng)的普通實現(xiàn)。也許把它應用于PHP程序是一個好的嘗試。
綜上而言,如下的說明能夠用于創(chuàng)建一個新的事件:
1. 創(chuàng)建一個EventObject 類的子類,用于給事件數據提供監(jiān)聽。通常命名為包含事件名稱和"event"結尾,就像ProtocolCommandEvent。這樣你以后可以重新使用已經存在的類甚至事件對象本身。
2. 創(chuàng)建或繼承一個用于實現(xiàn)監(jiān)聽的接口。通常接口名稱以"Listener"結尾并且包含1個或更多的被事件生成調用
關鍵詞標簽:Java,php
相關閱讀
熱門文章 plsql developer怎么連接數據庫-plsql developer連接數據庫方法 2021年最好用的10款php開發(fā)工具推薦 php利用淘寶IP庫獲取用戶ip地理位置 在 PHP 中使用命令行工具
人氣排行 詳解ucenter原理及第三方應用程序整合思路、方法 plsql developer怎么連接數據庫-plsql developer連接數據庫方法 PHP中防止SQL注入攻擊 PHP會話Session的具體使用方法解析 PHP運行出現(xiàn)Notice : Use of undefined constant 的解決辦法 PHP如何清空mySQL數據庫 CakePHP程序員必須知道的21條技巧 PHP采集圖片實例(PHP采集)