私は簡単なチャットアプリケーションを設計しています。私は、そのチャットアプリケーションのためのシンプルなデザインが不思議でした。概要を教えてください。ここにルールがあります:簡単なチャットアプリケーションのための適切なデザインパターン
- 匿名ユーザーはニックネームでチャットを入力してください。 (ユーザID)は、おそらくバックグラウンドでシステムによって割り当てられます。
- チャットの会話に参加する(購読する)ことができます。そして、彼は指定されたエリアに現れる他のユーザからのチャットテキストを見るでしょう。
- 彼らは特定の会話に返信することができ、誰もがそれを見るはずです。
これはIT! (私はそれが簡単なチャットアプリケーションだったと言っていますを参照してください)。だから、私の意図は本当にアプリケーションではありません。それに使用されているデザインパターンとオブジェクトです。
ここで私はそれをどのように設計しましたか? 2つの属性IDとニックネーム
- ユーザーオブジェクト(私は本当に重要その場合には.. Javaでコーディングしています)メッセージを格納する属性としての文字列。
- チャットウィンドウオブジェクト - 基本的にユーザーとメッセージの構成。 1つのユーザーオブジェクトとメッセージの一覧があるため。
- チャットセッション - 再び構成。基本的にはチャットウィンドウのリストがあります。各チャットウィンドウはチャットセッションに登録されます。チャットセッションは、新しいメッセージが表示されたときにすべてのチャットウィンドウに通知する役割を担います。 (Observer pattern anyone?)
これで、ChatWindowに "notify(Message)"というメソッドを持つChatListenerを実装させることで、オブザーバパターンを実装しました。そのため、ChatSessionは登録されているすべてのChatWindowに通知します。
ここでは、あなたの意見を明確にしたいと思っています。 1.チャットウィンドウが閉じられ、それ以上通知を受けたくない場合に備えて、すべてのチャットウィンドウに対しても登録解除メソッドを持つ必要があります。つまり、インスタンスを1つしか持たない「静的な」セントラル登録マネージャを用意しておけば、チャットウィンドウに「チャットセッション」IDを指定して登録を解除できるはずです。そのため、各チャットセッションにはIDが必要です。 (ここに含まれる)。私はチャットウィンドウでもチャットセッションのインスタンスを維持することができ、いつでもインスタンスを準備できます。 (私は彼らがoopsに逆らっていると思うので、私はシングルトンを嫌う)。 もう1つの方法は、チャットウィンドウのチャットウィンドウの登録抹消制御を持たないことです。代わりに、ウィンドウクロージャの通知がChatSessionに直接送られなければなりません。
このデザインはまったく意味がありますか?あなたがそれがCRAPの一部であり、私にまだ良いアプローチを与えていると言えば、あなたは間違いなく私から大きな感謝を得るでしょう。オブザーバーパターンとは別に、ここではすべてのパターンを単純化したり、より良くするために使用することができます。また、適切であればこの設計の弱点は改善できるが、
また、ユーザーが自分のチャットウィンドウで新しいメッセージを入力すると、すべてのチャットウィンドウに伝える必要があります。これは、チャットセッションと同じですが、同時にです。それは..チャットセッションは "チャットウィンドウの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);
}
}
}
}
すべての寄稿者に感謝します。 乾杯
貴重なフィードバックをいただきありがとうございます。これは私が正確に探していたものです。私はあなたの答えを正しいとすぐに受け入れてくれました。しかし、私はしばらく待つだろう。人々がより多くの答えを思い付く場合に備えて。 :) – Priyank
これは問題ありません。あなたが尋ねたように全体的なパターンに焦点を合わせなかったので、他の回答が「受け入れ」に適していると思われますが、上記を知ることは有益です –