适用于简单聊天应用程序的设计模式
我正在设计一个简单的聊天应用程序(仅此而已)。我一直想知道该聊天应用程序的简单设计。为了给您概述..这是规则:
- 匿名用户仅使用昵称输入聊天。(用户ID)大概是由系统在后台分配的。
- 他们可以加入(订阅)聊天对话。并且他将看到来自其他用户的聊天文本出现在指定区域。
- 他们可以回复特定的对话,其他所有人都应该看到。
而已!(请参阅我告诉您的那是一个简单的聊天应用程序)。因此,我的意图并不是真正的应用程序。但是设计模式和其中使用的对象。
现在这是我的设计方式。(我在用java ..编码,以防万一真的很重要)
- 用户对象-两个属性ID和昵称
- 消息对象-一个简单的消息接口和实现(目前)为SimpleMessage,具有String作为包含消息的属性。
- 聊天窗口对象-基本上由用户和消息组成。由于它具有一个用户对象和消息列表。
- 聊天会话-再次组成。基本上它将有一个聊天窗口列表。每个聊天窗口都会注册一个聊天会话。聊天会话负责在出现新消息时通知所有聊天窗口。(观察者模式有人吗?)
好吧..现在我通过使ChatWindow实现具有称为“ notify(Message)”方法的“
ChatListener”模式来实现观察者模式。因此,ChatSession会通知每个已注册的ChatWindow。
现在,我想澄清/希望您提出一些意见。1.我还需要对所有聊天窗口都使用注销方法,以防聊天窗口关闭并且不想再收到任何通知。这可能意味着,要么我应该拥有一个仅具有一个实例的“静态”中央注册管理器,然后任何聊天窗口都应该能够通过提供“聊天会话”
ID来注销自身。因此,每个聊天会话都应具有一个ID。(包括在此处)。或者,我也可以在“聊天窗口”中维护一个ChatSession实例,以始终准备好一个实例。(我讨厌单身人士,因为我认为它们不利于哎呀)。另一种方法是不对聊天窗口取消注册控制,而使用聊天窗口,
这种设计有道理吗?如果您说这是CRAP的一部分,请给我一个更好的方法;您肯定会从我这里得到极大的感谢。除了观察者模式以外,这里可以使用所有模式来进一步简化它或使其变得更好。另外,此设计的任何弱点,如果适当,但可以改进。
同样,当用户在自己的聊天窗口中键入新消息时;它必须传播到所有聊天窗口,这是聊天会话要做的,但同时;这是否意味着..聊天会话需要获取带有“聊天窗口ID”和消息的消息?然后将其传播到所有窗口,包括消息所有者之一?有什么更好的方法来解决这个问题。我的意思是,一种让窗口让聊天会话知道消息,然后再与所有其他窗口聊天的方式。(我想如果需要的话就需要一些…也不喜欢它们)
无论如何…请让我知道您的评论。还请雷姆。工作应用不是目的,我正在寻找一个好的讨论,良好的设计模式实践和用法。
完整的代码,如果给您很高的评价,请…随时将其拆开,并提出与几乎所有语义相关的问题。
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);
}
}
}
}
在此先感谢所有贡献者。干杯
回答:
只看User
对象,为什么平等取决于id 和
nickname?在我看来,这有点反常。我希望您有一个id,那么那就是对象的标识,因此可以在相等条件下使用。
我还看到您有一个用于用户ID的设置器。那么,您真的要更改用户ID吗?我发现您可以更改昵称,这很有意义。但我希望ID保持不变。
还要注意,由于要覆盖equals(),因此还应该覆盖hashCode()。
现在,如果hashCode()和equals()依赖于不可变字段(例如id),则hashCode()的结果将不会改变,如果将User放入哈希集合(例如HashMap)中,则以后再也不会丢失它(这很令人困惑)!
最后(!),我将保护构造函数和设置器免受空昵称(使它们抛出IllegalArgumentExceptions),然后使equals()之类的代码不必担心空昵称(除非’null’代表昵称)。我对id也会这样做,因为您将其作为Long(对象)。但这不是一个原始的时间吗?
以上是 适用于简单聊天应用程序的设计模式 的全部内容, 来源链接: utcz.com/qa/408841.html