Tiêu đề chắc hơi khó hiểu, tuy nhiên bạn xem 2 case sau đây sẽ dễ hiểu hơn. Đây được coi là 2 giải pháp giải quyết các Listener thường được dùng trong Java.


Case 1:


class ColorClick implements OnClickListener {
     public void onClick(View v) {
      // do something when the button is clicked
    }
}
 
protected void onCreate(Bundle savedValues) {
        ColorClick click = new ColorClick();
        for (int i=1; i<=10, i++){
            Button button = new Button(this)
            button.setOnClickListener(click);
        }
    }

Case 2:


protected void onCreate(Bundle savedValues) {
        for (int i=1; i<=10, i++){
            button.setOnClickListener(new OnClickListener(){
              public void onClick(View v) {
              // do something when the button is clicked
              }
 
            });
        }
    }

Cả 2 case bên trên đều không sai, hoàn toàn đúng cả. Còn nói về performance thì nó cũng chỉ xêm xêm nhau thôi. Nhưng cả 2 đều có ưu và nhược điểm.


Ưu và nhược điểm của Case 2:


Ưu điểm


Đơn giản, dễ hiểu và gọn gàng!


 


Nhược điểm


Việc tạo 1 object trong OOP khá tốn “tiền”. Vì mỗi lần tạo 1 object phải overhead cho obj, function jump, ..v…v.. và đặc biệt hơn đó là việc tạo 10 Object sẽ phải tốn 10 lần xóa bằng Garbage Collector (GC) cũng như dễ OutOfMemory. Vấn đề này rất hay gặp phải khi bạn là 1 dev Java, vì quản lí bộ nhớ trong Java khá là vất vả và thủ công.


 


Ưu và nhược điểm của Case 1:


Ưu điểm:


  • Rất tốt trong việc tạo 1 class listener cho nhiều button (hay view) khác nhau, đỡ tốn tài nguyên cũng như đỡ cực cho thằng GC.
  • Có thể dùng Generic để mở rộng việc hỗ nhợ nhiều kiểu dữ liệu hơn

Nhược điểm:


  • Nếu bạn chỉ cần 1 action đặc thù cho 1 button duy nhất, thì việc dùng Design Pattern này khá là rườm rà vì phải thêm class, rồi implement.