2014-07-13 17 views
4

我必須實施一個信用卡申請,其中我只能處理一個信用卡賬戶。像credit(),debit()pinChange()這樣的操作。如何使用回調機制?

但對我的問題是我必須使用「JAVA回調」機制,在兩種情況下,通知用戶:

  1. 引腳電平變化
  2. 當餘額低於5000

我如何爲這些通知使用回調?

使用回調更是這裏的焦點..

public interface Callback { 

    public void onPinChange(); 
    public void onLowBalance(); 

    } 
    import java.util.Scanner; 

    public class CreditCard implements Callback{ 

    Callback callback; 

    int pin; 
    float balance; 

    public CreditCard() { 

     callback = this; 
     this.pin = 1234; // default pin 
     this.balance = 10000f; // opening balance 

    } 

    public void creditBalance(float amount) { 
     this.balance = this.balance + amount; 

    } 

    public void debitBalance(float amount) { 
     if (balance <= amount) { 
      System.out.println("Not enough balance to debit"); 
     } else { 
      balance = balance - amount; 
     } 
     if (balance < 5000) { 
      callback.onLowBalance(); 
     } 

    } 

    public void changePin(int newPin) { 
     System.out.println("Enter the current pin"); 
     Scanner scanner = new Scanner(System.in); 
     int existingPin = scanner.nextInt(); 
     if (existingPin != pin) { 
      System.out.println("Wrong pin!"); 
     } else { 
      pin = newPin; 
      callback.onPinChange(); 
     } 
     scanner.close(); 
    } 

    @Override 
    public void onPinChange() { 
     System.out.println("Pin changed"); 

    } 

    @Override 
    public void onLowBalance() { 
     System.out.println("low balance"); 

    } 

    public static void main(String[] args) { 

     CreditCard card = new CreditCard(); 
     card.changePin(3333); 
     card.debitBalance(5200); 
    } 
} 

回答

4

更改Pin和獲得低餘額是CreditCard的行爲,因此CreditCard對象是事件生產者而不是事件偵聽器,因此您不希望使CreditCard成爲偵聽器(CallBack)。

實際上,您的CreditCard將回調您希望在發生pinChange或lowBalance等任何事件時收到通知的偵聽器的方法。

您的代碼應該是這樣的:

class CreditCard{ 
    int pin, balance; 
    private Callback callback; 
    CreditCard(Callback callback){ 
     this.callback=callback; 
    } 

    public void pinChange(int pin){ 
     this.pin=pin; 
     //inform the listener as well 
     callback.pinChanged(); 
    } 

    public void withdraw(int amount){ 
     this.balance-=amount; 
     //inform the the listener 
     if(balance<1000)callback.lowBalance(); 
    } 
} 

class MyListener implements Callback{ 
    public void pinChanged(){ 
     //do what is needed when somebody changes pin.. 
     //i.e send sms to the customer 
     System.out.println("PIN changed.."); 
    } 

    public void lowBalance(){ 
     //inform the customer about lowbalance. 
     System.out.println("little money in card.."); 
    } 

    main(String... args){ 
     CreditCard cc=new CreditCard(new MyListener()); 
     cc.changePin(3306); 
    } 
} 

希望這會清空...

+0

這使我的回調水晶般清晰的概念... yeeaaahh ...非常感謝jesse .. –

+0

你對他的代碼格式做了什麼? :| – Sufian

+0

@Sufian不確定這種格式化的工作是如何工作的......我想知道你是否能給我一些關於它的見解。 – SandeepGodara

0

幾點:

  1. 回調來nontify你有參考對象,以這樣莫名其妙的信用卡應該有引用要回叫的對象(並且它應該被傳入並保存使用類型回調
  2. 然後,您將使用您在CredicCard類中列出的方法中遞交的對象調用方法時間。例如在changePin調用onPinChange對你遞交的對象。
1

如果你只需要一個回調(我稱之爲監聽)每個事件,那麼你可以做到這一點(我只顯示了兩個監聽器中的一個,另外一個作品幾乎是相同的):

public interface PinChangeListener { 
    public void pinChanged(); 
} 

public CreditCard { 
    public PinChangeListener pinChangeListener; 

    private int pin; 

    public changePin(int pin) { 
     this.pin = pin; 
     if (pinChangeListener != null) { 
      pinChangeListener.pinChanged(); 
     } 
    } 
} 

爲了簡單起見,我將聽衆字段公開。我喜歡使用setter,然後我猜你知道它是如何工作的。

一個回調/監聽器連接到信用卡,你只需要實現PinChangeListener方法:

creditCard.pinChangeListener = new PinChangeListener() { 
    public void pinChanged() { 
     System.out.println("The pin has been changed"); 
    } 
}; 

您可以輕鬆地轉換代碼來支持每個事件的多個監聽。只需使用聽衆列表。通常你想寫的方法如addPinChangeListenerremovePinChangeListenertriggerPinChanged

+0

我用了你的答案,我已經更新了我的問題的代碼我現在有。是它的正確的方式使用回調機制? –

+1

沒有*正確的方式*。 Java沒有內置的回調/事件機制。最接近的是[觀察者模式](http://www.vogella。com/tutorials/DesignPatternObserver/article.html),例如在Swing UI庫中使用,這也基本上是我在我的答案中描述的。 關於您的新代碼:信用卡對象現在偵聽其自己的更改。這是沒有意義的。通常你想要通知一些外部對象關於信用卡更改,所以外部對象必須實現'Callback'接口,而不是'CreditCard'類。 – kayahr