2014-07-13 2 views
4

나는 신용 카드 계정을 하나만 처리해야하는 신용 ​​카드 응용 프로그램을 구현해야합니다. credit(), debit(), pinChange()과 같은 작업콜백 메커니즘을 사용하는 방법은 무엇입니까?

하지만 나를 위해 문제는 내가 "자바 콜백"를 사용하는 두 가지 경우에 사용자에게 통보하는 메커니즘이 있습니다 : 핀 변화에

  1. 균형이 아래로 갈 때 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를 청취자 (콜백)로 만들고 싶지는 않습니다.

실제로 귀하의 신용 카드는 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

커플 :

  • 콜백 당신이 참조가 객체를 nontify하는 데 사용됩니다
      그래서 어떻게 든 신용 카드가 있어야하기 다시 호출 할 객체에 대한 참조 (전달되어야하며 유형 콜백을 사용하여 전달되고 유지되어야 함)
    1. 그러면 CredicCard 클래스에 나열된 메소드에서 전달 된 객체를 사용하여 메소드를 호출합니다. 시각. changePin에있는 예제는 당신이 넘겨받은 객체의 onPinChange를 호출합니다.
  • 1

    당신은 단지 하나의 콜백이 필요한 경우이 작업을 수행 할 수있는 각 이벤트에 대한 (내가 청취자이 호출) (I에만 두 개의 리스너 중 하나 쇼, 다른 하나는 거의 동일하게 작동) :

    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(); 
         } 
        } 
    } 
    

    간단히하기 위해 listener 필드를 public으로 설정했습니다. 나는 당신이 그것을 어떻게 작동하는지 알 것 같네요 setter를 사용하는 것을 선호합니다.

    은 그냥 PinChangeListener 방법을 구현해야 신용 카드로 콜백/수신기를 연결하려면 :

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

    쉽게 이벤트에 여러 리스너를 지원하는 코드를 변환 할 수 있습니다. 청취자 목록을 사용하십시오. 일반적으로 addPinChangeListener, removePinChangeListenertriggerPinChanged과 같은 메서드를 작성하려고합니다.

    +0

    나는 당신의 대답을 사용하고 난 내가 현재 가지고있는 코드로 내 질문에 업데이트되었습니다 콜백 메커니즘을 사용하는 올바른 방법? –

    +1

    * 올바른 길 * 같은 것이 없습니다. Java에는 콜백/이벤트 메커니즘이 내장되어 있지 않습니다. 가장 가까운 것은 [관찰자 패턴] (http : //www.vogella.com/tutorials/DesignPatternObserver/article.html). 예를 들어 Swing UI 라이브러리에서 사용되며 기본적으로 제가 저의 답에서 설명한 것입니다. 새 코드 : 신용 카드 개체가 이제 자체 변경 내용을 수신 대기합니다. 그건 말이 안돼. 일반적으로 외부 객체가 신용 카드 변경 사항에 대해 통지 받기를 원하므로 외부 객체가'CreditCard' 클래스가 아닌'Callback' 인터페이스를 구현해야합니다. – kayahr

    관련 문제