The Observer Pattern

Name: Observer

(Otherwise known as "pub-sub")

Type: Behavioural

Use when you want to:

Define a dependency between objects so that whenever an object changes its state, all its dependents are notified.

From Wikipedia:

The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.

Real World Example:

A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity.

Typescript Code Example:

Job seekers that need to be notified for a job posting:

class JobPost {
    constructor(protected title: string) { }

    public getTitle() {
        return this.title;
    }
}
class JobSeeker {
    constructor(protected name: string) { }

    public notify(job: JobPost) {
        // Do something with the job posting
        console.log('Hi ' + this.name + '! New job posted: ' + job.getTitle();
    }
}

Job postings to which the job seekers will subscribe:

class JobBoard {
    private subscribers = []
    subscribe(jobSeeker) {
        this.subscribers.push(jobSeeker)
    }
    addJob(jobPosting) {
        this.subscribers.forEach(subscriber => {
            subscriber.notify(jobPosting)
        })
    }
}

Usage:

// Create subscribers
const jonDoe = new JobSeeker('John Doe')
const janeDoe = new JobSeeker('Jane Doe')
const kaneDoe = new JobSeeker('Kane Doe')

// Create publisher and attach subscribers
const jobBoard = new JobBoard()
jobBoard.subscribe(jonDoe)
jobBoard.subscribe(janeDoe)

// Add a new job and see if subscribers get notified
jobBoard.addJob(new JobPost('Software Engineer'))

// Output
// John Doe has been notified of a new posting : Software Engineer
// Jane Doe has been notified of a new posting : Software Engineer