이벤트 기반 아키텍처
이벤트 기반 아키텍처(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'); // 아무것도 발생하지 않음