0

私は精神的なループに陥っているか、少なくともオブザーバー パターンの実装方法を理解していません。私の意図したController実装は、文字通り、それが制御するインスタンスを文字通り観察することを意図しているObserver ためです。

観測されたオブジェクトは、文字どおり によって観測されることを意図しているObservable ため、拡張されますController。何を呼び出す.addObserver(responseHandler);のですか?別のクラスがオブザーバーをインスタンスに追加し、文字通り「オブザーバー」インターフェースを実装しますか? それは正しくありません。

-----編集----- responseHandler は、不明なコントローラーの総称です。

余談ですが、Java で実装されているこのパターンには名前付けの問題がありますか、それとも私の理解不足ですか?

コントローラのコントローラにモーフィングされたコントローラは次のとおりです。

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
    }
}

残念ながら、 APIを直接読むことは、私には分かりません。

WeatherTelnet これは Apache の例の拡張であり、単純なMUD クライアントに対してスクリプト化された telnet とライブ telnet 応答を同時に実行できるようにする一種の貧弱な Netty であり、終端されていない telnet データ ストリームのライブ処理と、ライブ出力とユーザー入力。

4

3 に答える 3

2

オブジェクトObservableaddObserver(yourController);. それらが変更されたら、次に を呼び出しsetChanged()、次にを呼び出す必要がありnotifyObservers()ます。カスタムの動作が必要な場合は、明らかにこれらのメソッドをオーバーライドできます。

例えば:

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

Observableまた、コントローラー ( ) がコントローラーを変更している場合は、 の参照をコントローラー ( )に与えることもできますObserver

ネーミング問題なし。をにObserver登録して、Observable通知方法を認識できるようにする必要があります。

注意: これがマルチスレッド環境で使用されることを意図している場合は、コントローラー クラスでの共有データの使用に注意する必要があります。

于 2013-09-01T02:30:28.967 に答える
1

実装するオブジェクトを作成するオブジェクト/クラスは、オブジェクトを渡しObservableてメソッドを呼び出す必要があります (の役割で)。addObserverMetaControllerObserver

パターンの観点からは、あなたMetaControllerは本当にあり得ないと思います。Observerおそらくそれは単なる所有者/作成者であり、ここからあなたの混乱です. MetaControllerからの通知を受け取る必要がありますObservableか? それともオブジェクトの 3 番目のカテゴリですか?

.addObserver(responseHandler);の代わりにあなたが書いた質問の一部として、私はこれを言います.addObserver(metaController);

于 2013-09-01T02:40:49.473 に答える
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();
    }
}
于 2013-09-01T03:25:31.237 に答える