Design Pattern | Chain Of Reponsibility Pattern

Chain of reponsibility pattern là một chuỗi các đối tượng chịu trách nhiệm xử lý các yêu cầu. Hãy nghĩ về nó như một yêu cầu giúp đỡ về vấn đề sức khỏe, vì vậy, bạn thử đến gặp bác sĩ nhưng vì sức khỏe có vấn đề, bác sĩ lại giới thiệu bạn đến gặp một chuyên gia, nhưng chuyên gia đó đang nghỉ phép và không thể làm việc vì vậy bạn được giới thiệu đi gặp một chuyên gia khác, và cuối cùng, chuyên gia này là người giải quyết vấn đề của bạn, nhưng thực sự bạn không quan tâm ai trong chuỗi chuyên gia y tế này giúp đỡ bạn, bạn chỉ quan tâm rằng vấn đề của bạn sẽ được giải quyết bởi ai đó.

Khi một đối tượng client gửi yêu cầu, trình xử lý đầu tiên trong chuỗi sẽ cố giải quyết nó, nếu không thể giải quyết, nó sẽ gửi yêu cầu đến trình xử lý tiếp theo, việc chuyển yêu cầu này tiếp tục cho đến khi một trình xử lý có thể giải quyết được yêu cầu, nếu yêu cầu đi qua toàn bộ trình xử lý mà không thể giải quyết thì đó là một yêu cầu không thỏa mãn.


Tiếp một ví dụ về điều này, giả sữ bạn đang sửa ghế và bạn cần một công cụ để siết chặt ốc vít, bạn không chắc chắn nên chọn công cụ nào, bạn có một số loại tua vít và cờ lê, bạn sẽ làm gì ? Bạn có thể lấy từng công cụ thử nó trên ốc vít cho đến khi một trong số chúng hoạt động. Điều này rất giống cách thức hoạt động Chain Of Reponsibily Pattern, mỗi đối tượng cố gắng xử lý yêu cầu cho đến khi một đối tượng có thể xử lý thành công.

Bạn cũng có thể nghĩ điều này giống như Exeption Handling trong Java, với xử lý ngoại lệ, bạn viết một loạt các khối try catch trong phần mềm của mình và đảm bảo các ngoại lệ được xử lý đúng cách.


Chain Of Reponsibily Pattern có thể được sử dụng trong nhiều mục đích khác nhau, giả sử bạn đang thiết lập một dịch vụ Email trong đó có rất nhiều cách để lọc qua Email, một thông báo email được xem xét bởi tất cả các bộ lọc cho đến khi nó được ứng dụng. Ví dụ, đối tượng bộ lọc có thể chuyển Email tới thư mục tin rác để thực hiện ở đó, nếu quy tắc không khớp với nội dung, nó sẽ chuyển đến bộ lọc tiếp theo, sử dụng mẫu thiết kế nêu trên là một cách rất phổ biến để thiết lập hành vi này.

Nhìn chung, sơ đồ UML của Chain Of Reponsibily Pattern trông như thế này:


Bạn có thể thấy một vấn đề với thiết kế này, ví dụ, có lỗi trong bôj lọc thứ hai, điều gì sẽ xảy ra nếu quy tắc của nó không khớp nhưng quên chuyển sang yêu cầu bộ lọc tiếp theo ? Do đó, việc xử lý kết thúc sớm, đây là một vấn đề của Chain Of Reponsibily Pattern, chúng ta cần một thuật toán để đảm bảo rằng mỗi lớp bộ lọc xử lý yêu cầu theo cách tương tự, đều trải qua các bước sau:

Đầu tiên, kiểm tra xem một quy tắc có phù hợp. Thứ hai, nếu nó phù hợp, xử lý hoàn thành. Thứ ba, nếu nó không khớp, hãy gọi bộ lọc tiếp theo trong danh sách.

Để đạt được điều này, bạn có thể dùng Template Pattern mà bạn đã học trước đó để đảm bảo mỗi lớp sẽ xử lý yêu cầu tương tự như cách được yêu cầu.

Mục đích của mẫu thiết kế này là bất cứ ai gửi yêu cầu cũng không phải quan tâm ai sẽ xử lý yêu cầu. Khi gặp vấn đề này, hãy nghĩ đến Chain Of Reponsibily Pattern.

Cảm ơn.

Nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Những thuật toán nền tảng trong lĩnh vực Trí tuệ nhân tạo (Artificial Intelligence I)