天天看點

java通過給按鈕添加監聽器了解接口的作用

按鈕作為一個公共元件,每個按鈕點選時的行為是不一樣,可能是删除按鈕,也可能是查詢按鈕,也可能是其他功能,對于這種不确定的功能,如何在設計按鈕元件時來編寫代碼呢?

public class Button {
 
 public void click(){      

有兩種方式,第一種方式,把Button類設計成抽象類,click方法設計為抽象方法,由具體的子類來實作不同的click行為,然而這種方法很明顯不可行,如果一個系統中有100個按鈕,難道要定義100個Button子類?對于Button這種微型元件來說這樣的設計方案太重量級了,不合适,那還有什麼更好的方式嗎?

那就是第二種方式,接口!

既然每個按鈕的行為是不一樣的,但是有一定是共同的,那就是按鈕的單擊方式是相同的,我們據此可以設計一個OnClickListener接口來描述這種統一的行為,統一的約定

public interface OnClickListener {
         public void onClick();
 }      

對于Button類來說,如何使用這種接口呢?這裡又有兩種方法,一種方案是Button類實作這個接口,然而這樣做的話和上面的問題就一樣了,我們常說一句話,組合優先于繼承(實作),那麼我們的另外一種方案就是:讓Button類持有一個OnClickListene類型的成員

public class Button {
         private OnClickListener onClickListener;
 
        public void click(){
                 onClickListener.onClick();
         }
 


        public void setOnClickListener(OnClickListener onClickListener) {
                 this.onClickListener = onClickListener;
         }
 
}      

如此一來,當點選按鈕的時候,實際上觸發的是接口的實作類操作,Button類僅僅依賴于一個特有的接口,至于這個接口是什麼樣的,可以由使用Button類的一方來自定義,如此一來,Button類的編寫不需要依賴于具體的實作,而是依賴于抽象接口,這就實作了類于類之間的松散耦合,這就是awt和swing中常用的監聽器模式

如何使用就很簡單了

Button queryButton = new Button();
                 
                OnClickListener onClickListener = new OnClickListener() {
                         
                         @Override
                         public void onClick() {
                                 System.out.println("執行查詢操作");
                                 
                         }
                 };
                 
                queryButton.setOnClickListener(onClickListener);
 
                //模拟按鈕被點選的操作
                 queryButton.click();