Định nghĩa
Avoid coupling the senderof a request to itsreceiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.Mẫu Chain of Responsiblity dùng để tránh sự liên kết trực tiếp giữa đối tượng gửi yêu cầu và đối tượng nhận yêu cầu khi yêu cầu có thể đựơc xử lý bởi hơn một đối tượng. Móc nối các đối tượng nhận yêu cầu thành một chuỗi và gửi yêu cầu theo chuỗi đó cho đến khi có một đối tượng xử lý nó.
Sơ đồ UML
Handler:
- Định nghĩa 1 interface để xử lý các yêu cầu.
- (Tùy chọn) Gán giá trị cho đối tượng successor.
- Xử lý yêu cầu.
- Có thể truy cập đối tượng successor (thuộc class Handler)
- Nếu đối tượng ConcreateHandler không thể xử lý được yêu cầu, nó sẽ gởi lời yêu cầu cho successor của nó.
Ưu điểm:
- Giảm kết nối. Thay vì một đối tượng có khả năng xử lý yêu cầu chứa tham chiếu đến tất cả các đối tượng khác, nó chỉ cần một tham chiếu đến đối tượng tiếp theo.
- Tăng tính linh hoạt và phân chia trách nhiệm cho các đối tượng.
- Có khả năng thay đổi dây chuyền trong thời gian chạy.
- Không đảm bảo có đối tượng xử lý yêu cầu.
Ví dụ
Để có tiền mua đồ chơi, đứa bé xin tiền anh hai nó, anh hai nó không đủ tiền, chuyển lời yêu cầu tới mẹ nó, mẹ nó cũng không đủ tiền, gởi lời yêu cầu cho ba nó. Nếu ba nó không đủ tiền thì lời yêu cầu sẽ không thực hiện. Ngược lại, ba nó sẽ thực hiện yêu cầu.Lớp Handler
public abstract class Approver
{
protected Approver Successor;
public abstract void HandleRequest(int money);
public void Next(Approver nextApprover)
{
Successor = nextApprover;
}
}
Lớp Concreate Handler
public class BrotherApproval: Approver
{
public override void HandleRequest(int money)
{
if (money < 50)
{
Console.WriteLine("{0} handled request {1}k", GetType().Name, money);
}
else
{
if (Successor != null)
Successor.HandleRequest(money);
}
}
}
public class MotherApproval: Approver
{
public override void HandleRequest(int money)
{
if (money < 100)
{
Console.WriteLine("{0} handled request {1}k", GetType().Name, money);
}
else
{
if (Successor != null)
Successor.HandleRequest(money);
}
}
}
public class FatherApproval: Approver
{
public override void HandleRequest(int money)
{
if (money < 200)
{
Console.WriteLine("{0} handled request {1}k", GetType().Name, money);
}
else
{
if(Successor != null)
Successor.HandleRequest(money);
}
}
}
class Program
{
static void Main(string[] args)
{
var money = new List<int> { 3, 30, 60, 100, 200, 500 };
Approver brotherApproval = new BrotherApproval();
Approver motherApproval = new MotherApproval();
Approver fatherApproval = new FatherApproval();
brotherApproval.Next(motherApproval);
motherApproval.Next(fatherApproval);
foreach (var i in money)
{
Console.WriteLine("Request {0}k", i);
brotherApproval.HandleRequest(i);
}
}
}
Ứng dụng
Chúng ta sử dụng mẫu Chain of Responsibility trong các trường hợp sau :- Có nhiều hơn một đối tượng có khả thực xử lý một yêu cầu trong khi đối tượng cụ thể nào xử lý yêu cầu đó lại phụ thuộc vào ngữ cảnh sử dụng.
- Muốn gửi yêu cầu đến một trong số vài đối tượng nhưng không xác định đối tượng cụ thể nào sẽ xử lý yêu cầu đó.
- Tập các đối tượng có khả năng xử lý yêu cầu là một tập biến đổi.
Nhận xét
Đăng nhận xét