Java Delegate

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.

About Langthang

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

6 comments :

  1. Hay quá, Bạn viết rất thú vị đọc rất dễ hiểu mà lại buồn cười.

    Cảm ơn bạn nhé

    ReplyDelete
  2. Bạn viết thêm về mục đích để làm gì thì tốt quá!

    ReplyDelete
  3. Theo mình biết thì Java thực hiện các Event theo cơ chế observer-observable còn .NET thì theo cơ chế của delegate. Mình nghĩ bạn nói làm giống như .NET có nghĩa là về mặt Event.
    Về mặt khả năng thì không ai nói Java hay .NET là tốt hay mạnh mẽ hơn. Nhưng về cách thức lập trình thì mình thấy .NET hướng tới người lập trình hơn rất nhiều.
    Những gì bạn implement ở trên cũng tốt, nhưng áp dụng vào Event của Java (những lớp đã có sẵn) thì không khả thi, và nếu muốn thực hiện một việc đơn giản là bấm cái nút, ghi dòng text thì với Java sẽ phải thực hiện khá nhiều thao tác (implements Intefaces hoặc sử dụng Adapter cho mỗi loại hành động, mỗi lớp lắng nghe). Hơn nữa, nếu bạn mong muốn thực hiện một project tầm trung và có nhiều lớp lắng nghe, nhiều lớp sinh sự kiện, nhiều kiểu dữ liệu truyền qua lại thì thực sự cơ chế Event của .NET nâng cao hiệu quả làm việc của lập trình viên cũng như tính dễ đọc của đoạn mã.

    Bài giới thiệu của bạn rất dễ hiểu, nhưng mình xin góp ý về mục đích bài viết (bạn Phạm Ngọc Hoài đã góp ý), có lẽ mục đích bài viết này là giới thiệu về cơ chế Event của Java thì hợp lý hơn.

    ReplyDelete
  4. Ko có ngôn ngữ yếu. Chỉ có ngôn ngữ bậc cao (thân thiện với USER hơn) hay ngôn ngữ bậc ít cao (thân thiện với COMPUTER hơn. Rõ ràng C# cao hơn java chút xíu (C# dễ lập trình hơn, java dễ compile hơn với nhiều hệ điều hành) =)). Còn ngôn ngữ thì từ hồi học lập trình đến h, mình chưa thấy ai bảo ngôn ngữ nào yếu cả. asm còn lập trình đồ họa đc nữa là zzzzz . Đang học java, bài này hay!

    ReplyDelete
  5. Mình đã dùng như bạn cho 2Jframe form. Khi click 1 button o form1 thì sẽ có thay đổi ở form2. Nhưng không dc bạn ah? bạn giúp mình voi

    ReplyDelete
  6. Java nhất quán hơn, người dùng C# dùng delegate biết thế thôi, chứ không biết bản chất bên dưới.

    ReplyDelete