Monday, October 11, 2010

Java Delegate

( from: http://dangtritue.blogspot.com/2008/08/java-delegate.html )


Trong lập trình .NET có kiểu delegate khá thú vị, trên rất nhiều diễn dàn tôi vẫn thường được nghe hỏi về delegate trong java.
 
Đương nhiên delegate trong Java thì không thể có được, và chỉ có thế thôi lắm kẻ ngốc đã tin rằng....java yếu xìu. Xin thưa, Java không có delegate nhưng có thể làm cái giống như delegate .NET có vậy. Tôi đoan chắc rằng, dù có đọc xong thì ối chú vẫn còn đang phân vân không biết có phải delegate không, nhìn sao nó dễ dàng quá, nếu mà làm trong .NET thì chôi chào, fix bug mấy em delegate này là điên luôn.
Chúng ta sẽ dùng mẫu Observer để làm cái này, đơn giản thế thôi à. 





class A extends Observable { 
void aMethod() { 
System.out.println("Xin chao");
 setChanged(); 
notifyObservers();//Nhấn nút báo cáo }; 
} 


Với class A này được thừa kế từ Observable, mấy chú nào muốn hỏi Class này ở đâu ra thì xin mở source JDK6, dạng mấy class như thế này sun cho lâu rồi. Rất dễ, trừ phi không biết .....lập trình. Class này rõ ràng là một tay thuộc dạng....có thể bị theo dõi bởi người khác nó là lính. Đừng loay hoay kiếm coi nó theo dõi ai và theo dõi như thế nào.

class B implements Observer { 
public void update(Observable observable, Object object) { 
System.out.println("A.aMethod() finished!"); 
}
}
class C implements Observer {
public void update(Observable observable, Object object) { 
System.out.println("A.aMethod() finished!"); 
}
}
Còn hai thằng này là Sếp, khốn khổ trong lập trình khác ngoài đời,  thường thì một thằng lính có nhiều thằng sếp, oái oăm thật, vậy mà bảo  là lập trình hướng đối tượng giống với đời thường. Hai chú này theo dõi  thằng A, chết mày chưa. 
Còn đây là chính sách công ty. Công ty Main giao cho 2 chú B, C quản lý chú A.


public class Main {
public static void main(String[] args) { 
A a = new A();//chú A hôm nay đi làm việc đây. 
a.addObserver(new B());// Bị đặt trong tầm ngắm của chú B 
a.addObserver(new C());//Và cả chú C 
a.aMethod();//Làm chuyện mờ ám.
}
} 


Hễ mỗi lần chú a mần ăn cái gì là phải báo cáo. chú nó nhấn nút cái kịch notifyObservers(). Thế là 2 chú kia biết chuyện gì liền.

XIN chao A.aMethod() finished! A.aMethod() finished! 
 
Cuộc đời bể khổ, nó làm lính khổ nhiều nên cho nó bấm một cái nút thôi là xong, mai mốt dù có nhiều thằng sếp đi nữa, chú nó cũng chỉ...nhấn nút. Gặp trường hợp ....chuôi chuối, tố chức công ty kém (thiết kế hệ thống) bắt chú nó chạy lăng xăng đi báo cáo (phải gọi hàm báo cáo từng object) thì thiệt là tội. Xin thưa em ở miền nam, dùng chú chú cho nó......vui chơi. Với lại em không thành kiến .NET, mắng mỏ chút đỉnh cũng chỉ cho....vui thôi.

No comments:

Post a Comment