技术开发 频道

实用比较:JAVA事件模式下PHP如何实现

    综上而言,如下的说明能够用于创建一个新的事件:

    1. 创建一个EventObject 类的子类,用于给事件数据提供监听。通常命名为包含事件名称和”event”结尾,就像ProtocolCommandEvent。这样你以后可以重新使用已经存在的类甚至事件对象本身。

    2. 创建或继承一个用于实现监听的接口。通常接口名称以“Listener”结尾并且包含1个或更多的被事件生成调用的函数,并且有一个符合对应的事件对象子集的自变量。

    3. 添加 “add<EventName>Listener(<EventName>Listener)” and “fire<EventName>()” 方法在事件生成器中. 任意的, 添加“remove<EventName>Listener(<EventName>Listener)”如果你想要移除监听。这些方法通过完善的训练,可以省略掉。

    4. 在你想要创建事件的代码中引入“fire<EventName>()”方法。这种方法可以被用于多种环境中例如,DatabaseError事件在数据库联接不能被创建或者查询失败的时候发生。

    The PHP event implementation requires two related classes to be defined and included into the PHP project: EventObject and ListenerList, as follows:

    PHP事件处理实现需要包含2个相关类在PHP工程里:EventObject and ListenerList就象下面的实例

    class EventObject {

    protected $source;

    function __construct($source) {
    $this->source = $source;
    }

    function getSource() {
    return $this->source;
    }

    }

    class ListenerList {

    protected $listeners = array();

    function add($listener) {
    $this->listeners[] = $listener;
    }

    function getRaw() {
    return $this->listeners;
    }

    }
    让我们来创建一个简单的用于产生事件并且同时进行监听的类。听起来满困难的,但是却是常被使用的技术
    interface MyEventListener {
    function onMyEvent(EventObject $event);
    }

    class MyClass implements MyEventListener {

    protected $listeners;

    function __construct() {
    $this->listeners = new ListenerList();
    $this->addMyEventListener($this);
    }

    function addMyEventListener(MyEventListener $listener) {
    $this->listeners->add($listener);
    }

    function work() {
    echo "Working!\n";
    $this->fireMyEvent();
    echo "Working!\n";
    $this->fireMyEvent();
    echo "Working!\n";
    }

    protected function fireMyEvent() {
    $event = new EventObject($this);
    foreach ($this->listeners->getRaw() as $listener) {
    $listener->onMyEvent($event);
    }
    }

    function onMyEvent(EventObject $event) {
    echo "Taking short break...\n";
    }

    }

    $object = new MyClass();
    $object->work();
    // Will print:
    // Working!
    // Taking short break...
    // Working!
    // Taking short break...
    // Working!

    使用事件描述模式,可以增进你的代码的稳定性,但是要注意的是他要在你的代码中添加很多接口和事件类,这样比没使用前执行要慢。

0
相关文章