Sử dụng các lớp giao thức

Một phần của tài liệu Phát triển phần mềm hướng Agent (Trang 112 - 114)

Như đã đề cập ở trên, các lớp giao thức cung cấp một số giao thức gọi lại. Những phương thức này có thể được lập trình viên sử dụng để định nghĩa lại bằng cách tùy biến chúng theo logic của miền ứng dụng. Chúng được khai báo để được bảo vệ và có một cài đặt mặc định. Theo cách này, lập trình viên có thể chọn (tùy thuộc vào yêu cầu cụ thể) phương thức nào sẽ cài đặt và phương thức nào sẽ bỏ qua. Với cả bên khởi tạo và bên đáp ứng, phần lớn các phương thức gọi lại đều được gọi theo việc nhận thông điệp và có dạng

protected handle<message-performative>(ACLMessage receivedMessage)

Ví dụ, trong ContractNetResponder, nếu thông điệp ACCEPT_PROPOSAL được nhận, thì phương thức handAcceptProposal (ACLMessage accept) được gọi. Khi việc nhận thông điệp kết

thúc một tương tác với bên gửi thông điệp (ví dụ khi thông điệp REFUSE được gửi làm thông điệp phản hồi cho thông điệp CFP trong Contract-Net protocol xác định rằng không còn thông điệp nào nữa cần được gửi trở lại bên đáp ứng), phương thức handletXXX() tương ứng sẽ trả về void. Nói cách khác, nếu thông phản hồi phải được gửi trả lại, chúng ta phân biệt 2 trường hợp. Với những bên đáp ứng mà luôn bị lôi cuốn vào các tương tác one-to-one, phươg thức handleXXX() trả về một ACLMessage. Giá trị được trả về sẽ được sử dụng là thông điệp phản hồi. Ví dụ, phương thức handleCfp() của ContractNetResponder thường được định nghĩa như sau:

Protected ACLMessage handleCfp(ACLMessage cfp){ ACLMessage reply = cfp.createReply(); //Evaluate the call

If (call OK) { //prepare a proposal reply.setPerformative(ACLMessage.PROPOSE); } else { reply.setPerformative(ACLMessage.REFUSE); } return reply; }

Để bắt đầu việc thiết kế hỗ trợ những tương tác một-nhiều, phương thức handleXXX () nhận thêm một đối số kiểu Vector. Ví dụ, phương thức handlePropose () của ContractNetInitiator thường sẽ được định nghĩa lại như sau:

protected void handlePropose(ACLMessage propose, Vector acceptances) {

ACLMessage reply = propose.createReply(); // Evaluate the proposal

if (proposal OK) { reply.setPerformative(ACLMessage.ACCEPT_PROPOSAL); } else { reply.setPerformative(ACLMessage.REJECT_PROPOSAL); } acceptances.add(reply); }

Để thấy được sức mạnh của các lớp giao thức tương tác, ta có thể đơn giản hóa hành vi BookNegotiator được trình bày trong Phần 3.3.5 dựa tren lớp ContractNetInitiator:

public class BookNegotiator extends ContractNetInitiator { private String title;

private int maxPrice;

private PurchaseManager manager;

public BookNegotiator(String t, int p, PurchaseManager m) { super(null, null);

title = t; maxPrice = p; manager = m; }

protected Vector prepareCFPs(ACLMessage cfp) { cfp = new ACLMessage(ACLMessage.CFP); cfp.setContent(title);

for (int i = 0; i < sellerAgents.size(); ++i) { cfp.addReceiver((AID) sellerAgents.get(i)); }

Vector v = new Vector(); v.add(cfp);

return v; }

protected void handleAllResponses(Vector responses Vector acceptances) {

ACLMessage bestOffer = null; int bestPrice = -1;

for (int i = 0; i < responses.size(); ++i) {

ACLMessage rsp = (ACLMessage) responses.get(i); if (rsp.getPerformative() == ACLMessage.PROPOSE) {

int price = Integer.parseInt(rsp.getContent()); if (bestOffer == null || price < bestPrice) {

bestOffer = rsp; bestPrice = price; } } } if (bestOffer != null) {

ACLMessage accept = bestOffer.createReply(); accept.setContent(title);

acceptances.add(accept); }

}

protected void handleInform(ACLMessage inform) { // Book successfully purchased

int price = Integer.parseInt(inform.getContent());

myGui.notifyUser("Book "+title+" successfully purchased. Price = "+price);

manager.stop(); }

} // End of inner class BookNegotiator

Phương thức prepareCFPs () được gọi ngay sau khi các hành vi ContractNetInitiator bắt đầu. Nó được dự định để điều chỉnh các thông điệp CFP được gửi đến các responder. Nó đặc biệt hữu dụng khi thông điệp CFP không biết đến vào thời gian xây dựng hoặc khi chúng ta cần gửi thông điệp tùy chỉnh tới mỗi responder. Tất cả các lớp khởi tạo giao thức có một phương pháp tương tự.

Một phần của tài liệu Phát triển phần mềm hướng Agent (Trang 112 - 114)