我正在设计一个简单的聊天应用程序(仅仅是为了好玩)。我一直在考虑聊天应用程序的简单设计。以下是规则概述:
现在这是我如何设计的(我用Java编码..如果那真的很重要):
现在这里有几件事情我想要澄清/想要你的意见:
1. 我需要为所有聊天窗口也有一个“取消注册”方法,以防聊天窗口关闭并且不希望再获得任何通知。这可能意味着,我应该有一个“静态”的中央注册管理器,它只有一个实例,然后任何聊天窗口都应该能够通过提供“聊天会话”ID来注销自己。由于这个原因,每个聊天会话都应该有一个ID。(包括在此处)。或者我也可以在Chat Window中维护一个ChatSession实例,始终准备好一个实例。(我讨厌单例,因为我认为它们违反了OOPS)。另一种方法是不使用聊天窗口的注销控制,而是直接将窗口关闭的通知发送到ChatSession,并且ChatSession应该执行其应该执行的操作!
2. 这种设计有意义吗?如果你说它很烂并给我一个更好的方法,你肯定会得到我的感谢。除了观察者模式之外,还可以在这里使用哪些模式来简化它或使其更好。此设计的任何弱点,如果它是合适的但可以改进。当用户在自己的聊天窗口中输入新消息时,需要将该消息传播到所有聊天窗口,这就是聊天会话所做的事情,但同时,这是否意味着聊天会话需要获得“聊天窗口ID”和消息?然后将其传播到所有窗口,包括拥有该消息的窗口?有没有更好的处理方式?我的意思是一种窗口让聊天会话知道消息,然后聊天会话将消息传递给所有其他窗口。(我想它会需要一些if...但我也不喜欢它们)
无论如何,请让我知道您的评论。此外,请注意工作应用程序并非目的,我正在寻找良好的讨论、良好的设计模式实践和用法。
如果以下完整代码让您兴奋,请随意分解并提出与几乎任何语义相关的问题。
- 匿名用户只需使用昵称进入聊天室。 用户ID由系统在后台分配。
- 他们可以加入(订阅)聊天对话,并在指定区域看到其他用户的聊天文本。
- 他们可以回复特定对话,其他人也能看到。
现在这是我如何设计的(我用Java编码..如果那真的很重要):
- User Object - 两个属性id和nickname
- Message Object - 简单的消息接口和实现(目前)作为SimpleMessage,具有一个字符串作为包含消息的属性。
- Chat Window Object - 基本上是用户和信息的组合。 它有一个用户对象和消息列表。
- Chat Session - 再次组合。基本上,它将拥有一个聊天窗口列表。每个聊天窗口都向聊天会话注册。 ChatSession负责通知所有聊天窗口,当出现新消息时。(观察者模式?)
现在这里有几件事情我想要澄清/想要你的意见:
1. 我需要为所有聊天窗口也有一个“取消注册”方法,以防聊天窗口关闭并且不希望再获得任何通知。这可能意味着,我应该有一个“静态”的中央注册管理器,它只有一个实例,然后任何聊天窗口都应该能够通过提供“聊天会话”ID来注销自己。由于这个原因,每个聊天会话都应该有一个ID。(包括在此处)。或者我也可以在Chat Window中维护一个ChatSession实例,始终准备好一个实例。(我讨厌单例,因为我认为它们违反了OOPS)。另一种方法是不使用聊天窗口的注销控制,而是直接将窗口关闭的通知发送到ChatSession,并且ChatSession应该执行其应该执行的操作!
2. 这种设计有意义吗?如果你说它很烂并给我一个更好的方法,你肯定会得到我的感谢。除了观察者模式之外,还可以在这里使用哪些模式来简化它或使其更好。此设计的任何弱点,如果它是合适的但可以改进。当用户在自己的聊天窗口中输入新消息时,需要将该消息传播到所有聊天窗口,这就是聊天会话所做的事情,但同时,这是否意味着聊天会话需要获得“聊天窗口ID”和消息?然后将其传播到所有窗口,包括拥有该消息的窗口?有没有更好的处理方式?我的意思是一种窗口让聊天会话知道消息,然后聊天会话将消息传递给所有其他窗口。(我想它会需要一些if...但我也不喜欢它们)
无论如何,请让我知道您的评论。此外,请注意工作应用程序并非目的,我正在寻找良好的讨论、良好的设计模式实践和用法。
如果以下完整代码让您兴奋,请随意分解并提出与几乎任何语义相关的问题。
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);
}
}
}
}
预先感谢所有贡献者。祝福大家