Trung BìnhDesign Patterns iconDesign Patterns

Chain of Responsibility là gì? Ứng dụng trong Express.js middleware?

Chain of Responsibility cho phép pass request qua chain of handlers — mỗi handler quyết định xử lý hoặc pass cho handler tiếp theo.

  • Express.js middleware là ví dụ hoàn hảo: app.use(authMiddleware, rateLimitMiddleware, validationMiddleware, routeHandler) — mỗi middleware gọi next() để pass request.

Ví dụ TypeScript:

typescript
interface Handler {
  setNext(h: Handler): Handler
  handle(request: number): string | null
}

abstract class AbstractHandler implements Handler {
  protected nextHandler?: Handler

  setNext(h: Handler) {
    this.nextHandler = h
    return h
  }

  handle(r: number): string | null {
    return this.nextHandler?.handle(r) ?? null
  }
}

class AuthHandler extends AbstractHandler {
  handle(r: number) {
    if (r < 0) return 'Unauthorized'
    return super.handle(r)
  }
}
  • Dùng khi: nhiều object có thể handle request và muốn decouple sender từ receiver; khi handlers nên được configurable hoặc reorderable tại runtime.
  • Khác Observer: Chain of Responsibility chỉ một handler xử lý; Observer notify tất cả.
  • Không dùng khi: chain quá dài gây performance issue; khi không rõ handler nào sẽ xử lý gây khó debug.

Xem toàn bộ Design Patterns cùng filter theo level & chủ đề con.

Mở danh sách Design Patterns