2014-06-17 2 views
4

나는 다음과 같은 클래스가 변경된 경우 이해어떻게 내 클래스의 속성의 속성

public class A { 
    private int number; 

    public int getNumber(){ 
     return number; 
    } 
    public void setNumber(int number){ 
     this.number = number; 
    } 
} 

및 속성으로 클래스 A의 객체를 가지고 다음 클래스 B

public class B { 
    private A member; 

    public A getMember() { 
     return member; 
    } 
    public void setMember(A member) { 
      this.member = member; 
    } 
} 

클래스 A의 정수가 변경 될 때 클래스 B에 알리고 싶습니다.

Observable and Observer를 사용하지 않고 알림 메커니즘을 사용하고 싶습니다. 어떤 아이디어? 관찰자 패턴을 제외하고 적합한 패턴이 있습니까?

편집 : 클래스 B가 이미 java.util.Observable의를 확장하고 내 궁극적 인 목표는

에서 클래스 B의 관찰자가 변경에 대해 알 수 있도록하는 것입니다 때문에 다시 관찰자를 사용하지 않는 이유는

개인 회원 A;

+0

청취자? 아니면 관측 가능과 비슷하다고 생각하십니까? –

+4

예, 양자 역학이 가능합니다! 진지하게, 단순히 관찰하는 것은 어떨까요? – Smutje

+1

리스너/이벤트 패턴이 여기서 제대로 작동 할 수 있습니까? – vikingsteve

답변

-1

만약 그렇다면, 클래스 A를 불변으로 만들 수 있습니다. 그런 다음 A를 변경하면 실제로 수행 할 작업은 String과 같은 새로운 불변 ​​객체를 생성하는 것입니다. 그런 다음 우연히 A로 변경하려면 B의 set 메소드를 사용하여 A를 새로운 A로 바꾸어야합니다.

이 패턴은 클라이언트에서 사용하기가 조금 힘들지만 set 메소드를 호출하여 B에서 A의 일부만 변경할 수 있기 때문에 클래스 B가 자동으로 통지된다는 것을 의미합니다.

기본적으로이 패턴을 사용할 때 A가 문자열이므로 상상할 필요가 있습니다. 따라서 새 문자열을 만들고 문자열을 변경할 수 없기 때문에 set을 호출하십시오.

0

클래스 A를 인터페이스로 선언하고 B에서이 인터페이스의 내부 위임 구현 (프록시 패턴)을 반환합니다. 이

public interface A { 
    void setNumber(int n); 
    int getNumber(); 
} 

public class B { 
    private A member; 
    private class AImpl implements A { 
    public void setNumber(int n) { 
     member.setNumber(n); 
     notifyB(); 
    } 
    public int getNumber() { 
     int res = member.getNumber(); 
     notifyB(); 
     return res; 
    } 
    } 
    public A getMember() { 
    return new AImpl(); 
    } 
    public void setMember(A member) { 
    this.member = member; 
    } 
    private void notifyB() { 
    // notification 
    } 
} 

대체와 같은

뭔가 당신은 또한 클래스 Proxy를 사용할 수 있지만 인터페이스는이 작업을 수행 할 수있는보다 더 낫다 방법입니다.