2009-07-29 3 views
9

私は簡単なチャットアプリケーションを設計しています。私は、そのチャットアプリケーションのためのシンプルなデザインが不思議でした。概要を教えてください。ここにルールがあります:簡単なチャットアプリケーションのための適切なデザインパターン

  1. 匿名ユーザーはニックネームでチャットを入力してください。 (ユーザID)は、おそらくバックグラウンドでシステムによって割り当てられます。
  2. チャットの会話に参加する(購読する)ことができます。そして、彼は指定されたエリアに現れる他のユーザからのチャットテキストを見るでしょう。
  3. 彼らは特定の会話に返信することができ、誰もがそれを見るはずです。

これはIT! (私はそれが簡単なチャットアプリケーションだったと言っていますを参照してください)。だから、私の意図は本当にアプリケーションではありません。それに使用されているデザインパターンとオブジェクトです。

ここで私はそれをどのように設計しましたか? 2つの属性IDとニックネーム

  • メッセージオブジェクト - - SimpleMessageような単純なメッセージ・インタフェースと実装(今のところ)、と

    1. ユーザーオブジェクト(私は本当に重要その場合には.. Javaでコーディングしています)メッセージを格納する属性としての文字列。
    2. チャットウィンドウオブジェクト - 基本的にユーザーとメッセージの構成。 1つのユーザーオブジェクトとメッセージの一覧があるため。
    3. チャットセッション - 再び構成。基本的にはチャットウィンドウのリストがあります。各チャットウィンドウはチャットセッションに登録されます。チャットセッションは、新しいメッセージが表示されたときにすべてのチャットウィンドウに通知する役割を担います。 (Observer pattern anyone?)

    これで、ChatWindowに "notify(Message)"というメソッドを持つChatListenerを実装させることで、オブザーバパターンを実装しました。そのため、ChatSessionは登録されているすべてのChatWindowに通知します。

    ここでは、あなたの意見を明確にしたいと思っています。 1.チャットウィンドウが閉じられ、それ以上通知を受けたくない場合に備えて、すべてのチャットウィンドウに対しても登録解除メソッドを持つ必要があります。つまり、インスタンスを1つしか持たない「静的な」セントラル登録マネージャを用意しておけば、チャットウィンドウに「チャットセッション」IDを指定して登録を解除できるはずです。そのため、各チャットセッションにはIDが必要です。 (ここに含まれる)。私はチャットウィンドウでもチャットセッションのインスタンスを維持することができ、いつでもインスタンスを準備できます。 (私は彼らがoopsに逆らっていると思うので、私はシングルトンを嫌う)。 もう1つの方法は、チャットウィンドウのチャットウィンドウの登録抹消制御を持たないことです。代わりに、ウィンドウクロージャの通知がChatSessionに直接送られなければなりません。

    1. このデザインはまったく意味がありますか?あなたがそれがCRAPの一部であり、私にまだ良いアプローチを与えていると言えば、あなたは間違いなく私から大きな感謝を得るでしょう。オブザーバーパターンとは別に、ここではすべてのパターンを単純化したり、より良くするために使用することができます。また、適切であればこの設計の弱点は改善できるが、

    2. また、ユーザーが自分のチャットウィンドウで新しいメッセージを入力すると、すべてのチャットウィンドウに伝える必要があります。これは、チャットセッションと同じですが、同時にです。それは..チャットセッションは "チャットウィンドウのID"とメッセージでメッセージを取得する必要があることを意味しますか?そしてそれはメッセージの所有者であるものを含むすべてのウィンドウにそれを伝えますか?これを処理するより良い方法は何ですか。私は、ウィンドウがチャットセッションにメッセージを知らせ、その後他のすべてのウィンドウにチャットする方法を意味します。

      とにかく...私はあなたのコメントをお聞かせください(私はそれはどちらかそれらを好きではない...の場合、いくつかの必要があります考えています)。また、remをお願いします。私は良い議論、良いデザインパターンの実践と使用法を探しています。

    以下の完全なコードは、あなたに高いものを与えてくれます...それを裂くとほとんどのセマンティクスに関連する問題を自由に感じてください。

    package com.oo.chat; 
    
    public class User { 
    
        private Long userId; 
        private String nickname; 
    
        public User(Long userId, String nickname) { 
         this.userId = userId; 
         this.nickname = nickname; 
        } 
    
        public void setUserId(Long userId) { 
         this.userId = userId; 
        } 
    
        public void setNickname(String nickname) { 
         this.nickname = nickname; 
        } 
    
        public Long getUserId() { 
         return userId; 
        } 
    
        public String getNickname() { 
         return nickname; 
        } 
    
        public boolean equals(Object objectToCompare) { 
         if (!(objectToCompare instanceof User)) { 
          return false; 
         } 
         User incoming = (User) objectToCompare; 
         if (incoming.getNickname() != null && incoming.getUserId() != null) { 
          if (incoming.getNickname().equalsIgnoreCase(this.nickname) 
            && incoming.getUserId().equals(this.userId)) 
           return true; 
         } 
         return false; 
        } 
    } 
    
    
    package com.oo.chat; 
    
    public interface Message { 
    
        public String getValue(); 
    
        public void setValue(String value); 
    
    } 
    
    package com.oo.chat; 
    
    public class SimpleMessage implements Message { 
    
        private String value; 
    
        public SimpleMessage() { 
    
        } 
    
        public SimpleMessage(String value) { 
         this.value = value; 
        } 
    
        public String getValue() { 
         return value; 
        } 
    
        public void setValue(String value) { 
         this.value = value; 
        } 
    } 
    
    package com.oo.chat; 
    
    public interface ChatListener { 
    
        public void notify(Message newMessage); 
    
    } 
    
    package com.oo.chat; 
    
    import java.util.ArrayList; 
    import java.util.List; 
    
    public class ChatWindow implements ChatListener { 
    
        private User user; 
        private List<Message> messageList; 
        private Long id; 
    
        public User getUser() { 
         return user; 
        } 
    
        public List<Message> getMessageList() { 
         return messageList; 
        } 
    
        public void setUser(User user) { 
         this.user = user; 
        } 
    
        public void setMessageList(List<Message> messageList) { 
         this.messageList = messageList; 
        } 
    
        public void addMessageToList(Message newMessage) { 
         if (this.messageList == null) { 
          this.messageList = new ArrayList<Message>(); 
         } 
         this.messageList.add(newMessage); 
        } 
    
        public void notify(Message newMessage) { 
         addMessageToList(newMessage); 
        } 
    
        public Long getId() { 
         return id; 
        } 
    
        public void setId(Long id) { 
         this.id = id; 
        } 
    } 
    
    package com.oo.chat; 
    
    import java.util.ArrayList; 
    import java.util.List; 
    
    public class ChatSession { 
    
        private List<ChatListener> registeredChatListeners; 
    
        public void register(ChatWindow chatWindow) { 
         if (registeredChatListeners == null) 
          registeredChatListeners = new ArrayList<ChatListener>(); 
         registeredChatListeners.add(chatWindow); 
        } 
    
        public List<ChatListener> getRegisteredChatListeners() { 
         return registeredChatListeners; 
        } 
    
        public void setRegisteredChatWindows(
          List<ChatListener> registeredChatListeners) { 
         this.registeredChatListeners = registeredChatListeners; 
        } 
    
        public void incomingMessage(Long chatListenerId, Message message) { 
         publish(message); 
        } 
    
        protected void publish(Message messageToPublish) { 
         if (registeredChatListeners != null) { 
          for (ChatListener eachListener : registeredChatListeners) { 
           eachListener.notify(messageToPublish); 
          } 
         } 
        } 
    } 
    

    すべての寄稿者に感謝します。 乾杯

  • 答えて

    4

    Userオブジェクトを見ると、IDはニックネームに一致するのはなぜですか?それは私には直感的ではないようです。私はあなたがIDを持っているならば、それはオブジェクトの識別であり、それで平等な条件で使うものがあると思います。

    ユーザーIDの設定があります。あなたは本当にユーザーIDを変更したいですか?あなたはニックネームを変えることができますが、これは理にかなっています。しかし、私はIDが一定のままであることを期待するでしょう。

    また、equals()をオーバーライドしているため、override hashCode()も指定する必要があります。

    ここで、hashCode()とequals()が不変なフィールド(IDなど)に依存する場合、hashCode()の結果は変更されません。また、ユーザーをハッシュしたコレクション(HashMapなど)後でそれを失うことはありません(これは非常に混乱します)!

    最後に(!)私はコンストラクタとセッターをnullニックネームから保護して(IllegalArgumentExceptionsをスローさせる)、equals()のようなコードはnullニックネームを心配する必要はありません( 'null'ニックネーム)。あなたがこれをロング(オブジェクト)として持っているので、私はイドに対して同じことをするでしょう。しかし、これは原始的な長いことではありませんでしたか?

    +0

    貴重なフィードバックをいただきありがとうございます。これは私が正確に探していたものです。私はあなたの答えを正しいとすぐに受け入れてくれました。しかし、私はしばらく待つだろう。人々がより多くの答えを思い付く場合に備えて。 :) – Priyank

    +0

    これは問題ありません。あなたが尋ねたように全体的なパターンに焦点を合わせなかったので、他の回答が「受け入れ」に適していると思われますが、上記を知ることは有益です –

    6

    基本的なデザインは、私には音になります。明らかにこれを完了するために、もっと多くの機能を追加する必要はありません。現在の設計では、すべてのメッセージが無期限にメモリに保持されますが、ある時点で古いメッセージを消去するコードが必要になります。私が見てい

    いくつかの重要な設計上の問題は、次のとおりです。

    1. メッセージインタフェースは、メッセージの送信者をリンクバックしない - ほとんどのチャットが何言っ誰示しており、これがなくて難しいだろうメッセージのユーザーフィールド。
    2. メッセージインターフェイスにはtimeプロパティがありません。これにより、古いメッセージをパージするのがより困難になります。
    +0

    ええと..私は両方の点に同意します..しかし、あなたがそれを見れば、現在のメッセージは誰がそれを送信し、タイムスタンプも伝えられません。より包括的なインプットクラスを持つMessageインターフェイスのインプリメントを計画していました。おそらく、タイムスタンプと送信者が追加されます。 メッセージを持続させることについては、私の心を越えましたが、私は実際にアプリケーションを開発しようとしていないため、その部分やUIを実装していませんでしたが、もの。デザインパターンの学習 これは、コメントが高く評価されていると言われています。ありがとうございます。 – Priyank

    2

    私は、メッセージングフレームワークの代わりに、Observerパターンを使用してに探してお勧めします。 eventbus(もはや利用可能) -

    はあなたのおもちゃのプロジェクトのために十分であろう、この単純な実装を見てみましょう。あるいは、ActiveMQのような完全なJMS実装を使用することもできます。

    基本的に、参加者の登録と登録解除が可能な共通バスを定義することができます。参加者全員に表示されるメッセージも送信できます。オブザーバーのパターンよりも大きな利点は、参加者間のカップリングが非常に低いことです。メッセージを受け取るために各オブジェクトに登録するのではなく、バスに登録するだけです。さらに、非同期処理(1000のチャットセッションがあるとします)を行います。オブザーバーを使用する場合は、完了するメッセージごとに1000セッションを更新する必要があります。メッセージフレームワークでは、メッセージの送信は非常に迅速で、1000セッションすべてにバックグラウンドで通知されます。

    関連する問題