Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Any OOP language? OK. Here's a ten-minute version in CLOS.</p> <h1>Broadcasting framework</h1> <pre><code>(defclass broadcaster () ((listeners :accessor listeners :initform '()))) (defgeneric add-listener (broadcaster listener) (:documentation "Add a listener (a function taking one argument) to a broadcast's list of interested parties")) (defgeneric remove-listener (broadcaster listener) (:documentation "Reverse of add-listener")) (defgeneric broadcast (broadcaster object) (:documentation "Broadcast an object to all registered listeners")) (defmethod add-listener (broadcaster listener) (pushnew listener (listeners broadcaster))) (defmethod remove-listener (broadcaster listener) (let ((listeners (listeners broadcaster))) (setf listeners (remove listener listeners)))) (defmethod broadcast (broadcaster object) (dolist (listener (listeners broadcaster)) (funcall listener object))) </code></pre> <h1>Example subclass</h1> <pre><code>(defclass direct-broadcaster (broadcaster) ((latest-broadcast :accessor latest-broadcast) (latest-broadcast-p :initform nil)) (:documentation "I broadcast the latest broadcasted object when a new listener is added")) (defmethod add-listener :after ((broadcaster direct-broadcaster) listener) (when (slot-value broadcaster 'latest-broadcast-p) (funcall listener (latest-broadcast broadcaster)))) (defmethod broadcast :after ((broadcaster direct-broadcaster) object) (setf (slot-value broadcaster 'latest-broadcast-p) t) (setf (latest-broadcast broadcaster) object)) </code></pre> <h1>Example code</h1> <pre><code>Lisp&gt; (let ((broadcaster (make-instance 'broadcaster))) (add-listener broadcaster #'(lambda (obj) (format t "I got myself a ~A object!~%" obj))) (add-listener broadcaster #'(lambda (obj) (format t "I has object: ~A~%" obj))) (broadcast broadcaster 'cheezburger)) I has object: CHEEZBURGER I got myself a CHEEZBURGER object! Lisp&gt; (defparameter *direct-broadcaster* (make-instance 'direct-broadcaster)) (add-listener *direct-broadcaster* #'(lambda (obj) (format t "I got myself a ~A object!~%" obj))) (broadcast *direct-broadcaster* 'kitty) I got myself a KITTY object! Lisp&gt; (add-listener *direct-broadcaster* #'(lambda (obj) (format t "I has object: ~A~%" obj))) I has object: KITTY </code></pre> <p>Unfortunately, Lisp solves most of the design pattern problems (such as yours) by eliminating the need for them.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload