이벤트 기반 아키텍처(event-driven architecture, EDA)는 이벤트의 제작, 감지, 소비, 반응을 제고하는 소프트웨어 아키텍처 패턴이다.
이벤트는 "상태의 상당한 변화"로 정의할 수 있다.[1] 예를 들어, 소비자가 자동차를 구매할 때 자동차의 상태는 "판매 중"에서 "판매 완료"로 바뀐다.
public class FooPanel extends JPanel implements ActionListener {
public FooPanel() {
super();
JButton btn = new JButton("Click Me!");
btn.addActionListener(this);
this.add(btn);
}
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("Button has been clicked!");
}
}
다른 방법으로는 다음과 같다.
public class FooPanel extends JPanel {
public FooPanel() {
super();
JButton btn = new JButton("Click Me!");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Button has been clicked!");
}
});
this.add(btn);
}
}
(() => {
'use strict';
class EventEmitter {
constructor() {
this.events = new Map();
}
on(event, listener) {
if (typeof listener !== 'function') {
throw new TypeError('The listener must be a function');
}
let listeners = this.events.get(event);
if (!listeners) {
listeners = new Set();
this.events.set(event, listeners);
}
listeners.add(listener);
return this;
}
off(event, listener) {
if (!arguments.length) {
this.events.clear();
} else if (arguments.length === 1) {
this.events.delete(event);
} else {
const listeners = this.events.get(event);
if (listeners) {
listeners.delete(listener);
}
}
return this;
}
emit(event, ...args) {
const listeners = this.events.get(event);
if (listeners) {
for (let listener of listeners) {
listener.apply(this, args);
}
}
return this;
}
}
this.EventEmitter = EventEmitter;
})();
사용법:
const events = new EventEmitter();
events.on('foo', () => { console.log('foo'); });
events.emit('foo'); // "foo" 출력
events.off('foo');
events.emit('foo'); // 아무것도 발생하지 않음