Skip to main content
skill CX Codex

mediator-pattern — Claude Code skill: central hub for components

A skill that teaches the mediator pattern: components talk through one central point instead of calling each other. Useful once those direct links get tangled.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add PatternsDev/skills --skill mediator-pattern -a claude-code
Open on GitHub

What mediator-pattern does

The skill walks your agent through the mediator pattern, where requests land in a central object and get forwarded to the right handler. In JavaScript that mediator is often just an object literal or a function. Individual components stay unaware of each other and only know the mediator.

Two examples carry the explanation. A chatroom shows a ChatRoom class logging messages while User sends through it rather than to other users. Then Express.js middleware: callbacks receive req, res and next, and a header added early stays visible down the chain. The skill also spells out when to skip the pattern — few participants, a mediator turning into a monolithic god object, or observer and pub-sub already providing enough decoupling.

It activates on **/*.js and **/*.ts files. Installation runs through npx skills add or gh skill install; the skill itself executes nothing and needs no API key. Related entries are module-pattern and singleton-pattern.

What it helps with

  • untangle components that currently call each other directly
  • build a middleware chain that shares one request object
  • explain to the agent when a mediator turns into a god object
  • decide between a mediator and pub-sub for one module
  • show how a chatroom works as a central communication point

Example prompts for the agent

  • Refactor this module to the mediator pattern so the components stop knowing about each other
  • Build an Express middleware chain that sets a header and logs it further down
  • Should I use a mediator here or is observer enough? Look at my code

How to install mediator-pattern

1Skills CLI (Vercel)

npx skills add PatternsDev/skills --skill mediator-pattern -a claude-code

2Manually: put the files in place

~/.claude/skills/mediator-pattern/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/mediator-pattern/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about mediator-pattern

How do I install mediator-pattern in Claude?

Run npx skills add PatternsDev/skills --skill mediator-pattern -a claude-code. The skill file lands at ~/.claude/skills/mediator-pattern/SKILL.md.

What does mediator-pattern do?

It describes the mediator pattern, where components send requests to a central object that forwards them to the right handlers. Examples cover a chatroom and Express.js middleware.

When should I avoid this pattern?

The skill lists the cases: few participants make direct calls simpler, the mediator risks becoming a monolithic object, or observer and pub-sub already decouple things well enough.

Source text

SKILL.md · MIT
---
name: mediator-pattern
description: Teaches the mediator pattern for centralized component communication. Use when multiple components need to communicate and direct coupling between them creates complexity or tight dependencies.
paths:
  - "**/*.js"
  - "**/*.ts"
license: MIT
metadata:
  author: patterns.dev
  version: "1.1"
related_skills:
  - "module-pattern"
  - "singleton-pattern"
---

# Mediator/Middleware Pattern

The mediator pattern makes it possible for components to interact with each other through a central point: the mediator. Instead of directly talking to each other, the mediator receives the requests, and sends them forward! In JavaScript, the mediator is often nothing more than an object literal or a function.

You can compare this pattern to the relationship between an air traffic controller and a pilot. Instead of having the pilots talk to each other directly, which would probably end up being quite chaotic, the pilots talk the air traffic controller. The air traffic controller makes sure that all planes receive the information they need in order to fly safely, without hitting the other airplanes.

## When to Use

- Use this when multiple objects need to communicate but direct many-to-many relationships would be chaotic
- This is helpful for implementing middleware chains (e.g., Express.js middleware)

## When NOT to Use

- When direct communication between two components is simpler and the system has few participants
- When the mediator itself becomes a monolithic "god object" that's hard to maintain
- When event-driven patterns (observer/pub-sub) provide sufficient decoupling without a central coordinator

## Instructions

- Create a central mediator that processes requests and forwards them to the appropriate handlers
- Use the middleware pattern to chain processing functions that can modify requests/responses
- Keep individual components unaware of each other; they only know about the mediator

## Details

Although we're hopefully not controlling airplanes in JavaScript, we often have to deal with multidirectional data between objects. The communication between the components can get rather confusing if there is a large number of components.

Instead of letting every object talk directly to the other objects, resulting in a many-to-many relationship, the object's requests get handled by the mediator. The mediator processes this request, and sends it forward to where it needs to be.

A good use case for the mediator pattern is a chatroom! The users within the chatroom won't talk to each other directly. Instead, the chatroom serves as the mediator between the users.

```js
class ChatRoom {
  logMessage(user, message) {
    const time = new Date();
    const sender = user.getName();

    console.log(`${time} [${sender}]: ${message}`);
  }
}

class User {
  constructor(name, chatroom) {
    this.name = name;
    this.chatroom = chatroom;
  }

  getName() {
    return this.name;
  }

  send(message) {
    this.chatroom.logMessage(this, message);
  }
}
```

We can create new users that are connected to the chat room. Each user instance has a `send` method which we can use in order to send messages.

### Case Study

[Express.js](https://expressjs.com) is a popular web application server framework. We can add callbacks to certain routes that the user can access.

Say we want add a header to the request if the user hits the root `'/'`. We can add this header in a middleware callback.

```js
const app = require("express")();

app.use("/", (req, res, next) => {
  req.headers["test-header"] = 1234;
  next();
});
```

The `next` method calls the next callback in the request-response cycle. We'd effectively be creating a chain of middleware functions that sit between the request and the response, or vice versa.

Let's add another middleware function that checks whether the `test-header` was added correctly. The change added by the previous middleware function will be visible throughout the chain.

```js
const app = require("express")();

app.use(
  "/",
  (req, res, next) => {
    req.headers["test-header"] = 1234;
    next();
  },
  (req, res, next) => {
    console.log(`Request has test header: ${!!req.headers["test-header"]}`);
    next();
  }
);
```

Perfect! We can track and modify the request object all the way to the response through one or multiple middleware functions.

Every time the user hits a root endpoint `'/'`, the two middleware callbacks will be invoked.

The middleware pattern makes it easy for us to simplify many-to-many relationships between objects, by letting all communication flow through one central point.

## Source

- [patterns.dev/vanilla/mediator-pattern](https://patterns.dev/vanilla/mediator-pattern)

### References

- [Docs - Express](https://expressjs.com)
- [Mediator Pattern - OO Design](https://www.oodesign.com/mediator-pattern.html)

© patterns.dev · MIT · PatternsDev/skills

Similar skills

All skills for Programming languages →

From the same set44

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor