2016-08-29 2 views
0

특정 오브젝트에 대한 메소드에 대한 리스너를 작성할 수 있습니까?Java - 특정 오브젝트에 대한 메소드의 리스너

개체 A는 개체 B를 만듭니다. 개체 A는 B.drive()가 호출되면 알기를 원하지만 개체 C (B와 동일한 클래스) C.drive()가 호출되는시기는 신경 쓰지 않습니다.

+1

물론 가능합니다. Observer 패턴을 사용 하시겠습니까? –

+0

ID를 사용하여 각 개체를 식별하고 ID를 기반으로 결정할 수 있습니다 –

+0

컨테이너를 사용하는 경우 [AOP] (https://en.wikipedia.org/wiki/Aspect-oriented_programming)를 사용하여 해결할 수 있습니다 그 문제. – Rodolfo

답변

1

예, 리스너 패턴의 tipical 사용은 특정 객체를 듣고 있습니다. 그래서 객체 B와 C 메소드 setListener(SomeClassListener listener)의 클래스와 클래스 검사의 drive에서 리스너가 설정되었는지, 리스너가있는 경우 메소드를 실행하십시오.

내가 당신의 상황을 이해 같은 개체 공장 패턴을 구현 - 그것은 개체를 만듭니다, 그래서 A는 또한 리스너해야 객체와이 객체를 생성 객체 B 호출 b.setListener(a)를 만들 때 C이 메소드를 호출 할 수 없습니다.

결국 경우 생성 (해야합니다!) 매개 변수를 사용하여 객체 팩토리 메소드의 클래스에서 만든 내부 개체 A를 할 수 없을시 :

SomeClass createObj(boolean setListener){ 

    SomeClass obj=new SomeClass(); 
    if (setListener){ 

     obj.setListener(this); 
    } 

    return obj; 
} 

객체 B의 생성은 모양을 정도 :

SomeClass b=a.createObj(true); 

오브젝트 C (수신하지 않음)

SomeClass c=a.createObj(); 
0

다음은 리스너 p의 간단한 예입니다 attern.

public class ObjectA implements DriveListener { 

    //defined in interface DriveListener 
    @Override 
    public void onDrive(ObjectB source){ 
     doSomething(); 
    } 

    // a simple factory creating ObjectB instances 
    public ObjectB makeB(){ 
     ObjectB b = new ObjectB(); 
     b.setListener(this); 
     return b; 
    } 

} 

public class ObjectB { 

    private DriveListener driveListener; 

    public void setListener(DriveListener l){ 
     this.driveListener = l; 
    } 

    public void drive() { 
     //do something... 

     //notify the listener if any. 
     if(driverListener!=null){ 
      driverListener.onDrive(this); 
     } 
    } 
} 
관련 문제