5

ローカルとオンラインの両方で動作するゲームを作成したいと考えています。

私が最初に考えたのは、GUI がビジネス ロジックに必要とするすべてのメソッドを持ち、ネットワーク実装とローカル実装を持つインターフェイスを作成することでした。

これは、要求応答メッセージに対してはうまく機能します。しかし、いくつかの GUI コンポーネント (すなわち JLabels) を更新しなければならない場合に、サーバーが送信するメッセージはどうでしょうか?

これに対する私の最初の解決策は、実装の各変更がイベントを発生させるリスナーを実装することでした。GUI は、そのコンポーネントを適切に登録および変更します。ただし、ビジネス ロジックでイベントを発生させる呼び出しは少し間違っているように見えます。

私は正しい軌道に乗っていますか?私はそうではないと思うからです。助言がありますか?

ありがとうございました。

注: クライアントは単純な Java Swing GUI です。

4

2 に答える 2

6

あなたが説明したことは、モデルをプレゼンテーションの問題から独立させるという目標に役立ちます。これは良いことです。これは、モデルの特定の変更が特定のイベントを発生させることに基づいて単体テストを作成できるため、モデルの設計、開発、および保守時にも役立ちます。画面上でどのように見えるかを気にする必要はありません。

そしてもちろん、さまざまな環境に合わせてさまざまな GUI デザインを使用できるようになります。

重要なのは、イベントはモデルの状態の変化に関するものであり、プレゼンテーション レベルでの意図したアクション/表現に関するものではないということです。モデルイベントに応答するかどうか/どのように応答するかは、プレゼンテーション層に任せます。

于 2008-12-27T16:18:03.837 に答える
1

私は Web 開発をしているので、Swing の経験はあまりありません。

しかし、アプリをパッケージ /view、/model、および /controller に分割することは、私がアプローチする方法だと常に考えていました。/controller は /model と /view の両方を認識しますが、どちらも /controller からクラスをインポートしたり、相互にインポートしたりしません。

/view 層のコンポーネントが JFrame になることはありません。それらは常に JPanel か、必要に応じて JFrame にまとめて構成できる別の適切なコンテナーです。それぞれが、コンストラクターで初期化された Listener インターフェースへの参照を持ち、イベント処理のためにこれらを延期します。

public class ExamplePanel extends JPanel implements ActionListener
{
    private JButton button;
    private ActionListener buttonListener;

    public ExamplePanel(ActionListener buttonListener)
    {    
        this.button = new JButton("Do Something");
        this.buttonListener = buttonListener;
        this.button.addListener(this.buttonListener);
    }

    public void actionPerformed(ActionEvent e)
    {
        this.buttonListener.actionPerformed(e);
    }
}

この配置は、依存性注入とうまく機能します。コントローラーは、クライアントにまったく影響を与えない方法で動作を変更して、そのリスナー インターフェイスのローカルまたはリモート実装を使用することを選択できるようになったためです。

私はそれを最後までたどったことがないことを認めます。

Spring の人々は豊富な Swing クライアント モジュールを持っていますが、人気がなくなったようです。リッチ クライアントには BlazeDS の方が適していると判断したようです。しかし、彼らのアプローチからいくつかのデザインのアイデアを得ることができるかもしれません。

于 2008-12-27T17:21:08.280 に答える