0

정신적 인 루프에 걸렸거나 적어도 관찰자 패턴을 구현하는 방법에 대한 이해가 부족합니다. 내 의도 된 ControllerObserver을 구현합니다. 문자 그대로, 문자 그대로 제어하는 ​​인스턴스를 의미하기 때문입니다.MetaController는 세 개의 객체를 관찰해야합니다

Observable은 문자 그대로 Controller에 의해 관찰되기 때문에 관찰 된 개체가 확장됩니다. .addObserver(responseHandler);을 어떻게 불러야합니까? 다른 클래스는 사실상 Observer 인터페이스를 구현하는 인스턴스에 옵저버를 추가합니다. 그건 옳지 않아.

----- 편집 ResponseHandler에 어떤 알 수없는 컨트롤러 여담으로

단지 일반적인 이름이고, 자바로 구현 된이 패턴에 이름과 네이밍 문제가, 아니면 그냥 부족 ----- 내 부분에 대한 이해? API 직접, 불행히도, 나를 위해 조명되지 읽기

public class MetaController implements Observer { 

    private final static Logger LOG = Logger.getLogger(MetaController.class.getName()); 
    private Printer telnetPrinter = new Printer(); 
    private telnetDataProcessor telnetDataProcessor = new telnetDataProcessor(); 
    private StringReader stringReader = new StringReader(); 
    private final ConcurrentLinkedQueue<Character> telnetData = new ConcurrentLinkedQueue(); 

    public MetaController() { 
    } 

    //the printer and processor each spawn their own thread so that they don't 
    //block each other waiting for each other 
    public void readPrintParse(final InputStream inputStream) throws SocketException, IOException { 
     telnetPrinter.print(inputStream, telnetData); //populate telnetData in its own thread 
     telnetDataProcessor.read(telnetData); //process telnetData in its own thread 
    } 

    //the StringReader just looks for particular keywords like "press enter to continue" 
    //so that some phrases will trigger a response 
    //commands may also be typed manually by the user (not implemented yet) 
    @Override 
    public void update(Observable o, Object arg) { 
     //when telnetDataProcessor sends a String, send that String on to stringReader 
     String cmd = stringReader.parse(null); //parse what and how? 
     //send the command string back to the telnetClient 
    } 
} 

:

다음은 이제 컨트롤러의 컨트롤러로 변신 한 컨트롤러입니다.

뿐만 아니라, 비 종료 텔넷 데이터 스트림의 실시간 처리를 필요로하는 아파치 WeatherTelnet example의 확장, 간단한 MUD client 동시 스크립트 텔넷 및 라이브 텔넷 응답을 허용하는 가난한 마르스의 Netty의 일종이다 라이브 출력 및 사용자 입력

+0

addObserver (이) ???? – Thufir

답변

2

Observable 개체는 addObserver(yourController);이어야합니다. 변경되면 setChanged()으로 전화를 걸어 notifyObservers()으로 전화해야합니다. 사용자 정의 동작이 필요한 경우 분명히 이러한 메서드를 재정의 할 수 있습니다. 예를 들어

: 그는 그것을 수정하는 사람도 있다면 당신은 또한 컨트롤러 (Observer)에 Observable의 참조를 제공 할 수 있습니다

MetaController controller = new MetaController(); 
Observable observable1 = new Weather1(); 
Observable observable2 = new Weather2(); 
Observable observable3 = new Weather3(); 
observable1.addObserver(controller); 
observable2.addObserver(controller); 
observable3.addObserver(controller); 

.

이름 지정에 문제가 없습니다. Observer은 알림 방법을 알 수 있도록 Observable에 등록해야합니다.

주의 : 멀티 스레드 환경에서 사용하기위한 것이라면 컨트롤러 클래스에서 공유 데이터를 사용할 때주의해야합니다.

+0

첫 번째 구를 번역하는 경우 영어로만 표시됩니다. "관찰 할 수있는 객체는 addObserver (yourController);" 그게 자연 언어로 무엇을 의미합니까? 내 말은, ** 어디에서 ** addObserver (yourController)입니까? 관찰 된 객체에는 컨트롤러에 대한 참조가 없습니다. 나는 addObserver (this)를 사용하여 현재 시도하고있다. – Thufir

+1

'관찰자'는 '관찰 가능'시계를 시청합니다. 코드에서, 이것은 'Observable'으로 자신을 등록하는 Observer로 변환되어 통지를받을 수 있습니다. 당신의 클래스가'Observable'에 대한 인스턴스 필드 참조를 가지고 있다면'observable.addObserver (this)'를 사용할 수 있습니다. –

1

그들의 addObserver 방법 (Observer의 역할로) MetaController 객체를 전달한다 Observable 호출을 구현 객체를 생성하는 오브젝트/클래스.

나는 귀하의 MetaController이 실제로는 패턴의 관점에서 보면 Observer이 아닐 것이라고 생각합니다. 아마도 그것은 단지 주인/창조자 일 뿐이며 여기에서 혼란 스러울 것입니다. Observable에서 알림을 받으려면 MetaController이 필요합니까? 아니면 개체의 세 번째 범주?

질문의 일부로 대신 .addObserver(responseHandler);을 작성했기 때문에이 말을합니다.

+0

responseHandler는 일반적인 이름으로 의도되었으며, MetaController는 의도 한 컨트롤러입니다. 당신이 지적했듯이, 아마 ** 아닙니다 **. – Thufir

0

는 여기에 내가 무엇을 최대 온의 :

package telnet; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.SocketException; 
import java.util.Observable; 
import java.util.Observer; 
import java.util.concurrent.ConcurrentLinkedQueue; 
import java.util.logging.Logger; 

public class Controller implements Observer { 

    private final static Logger LOG = Logger.getLogger(Controller.class.getName()); 
    private Printer telnetPrinter = new Printer(); 
    private telnetDataProcessor telnetDataProcessor = new telnetDataProcessor(); 
    private StringReader stringReader = new StringReader(); 
    private final ConcurrentLinkedQueue<Character> telnetData = new ConcurrentLinkedQueue(); 

    public Controller() { 
    } 

    public void readPrintParse(final InputStream inputStream) throws SocketException, IOException { 
     telnetPrinter.print(inputStream, telnetData); 
     telnetPrinter.addObserver(this); 
     telnetDataProcessor.read(telnetData); 
     telnetDataProcessor.addObserver(this); 
     stringReader.addObserver(this); 
    } 

    @Override 
    public void update(Observable o, Object arg) { 
     System.out.println("updated..."); 
     String s = telnetDataProcessor.getString(); 
    } 
}