适用于简单聊天应用程序的设计模式

我正在设计一个简单的聊天应用程序(仅此而已)。我一直想知道该聊天应用程序的简单设计。为了给您概述..这是规则:

  1. 匿名用户仅使用昵称输入聊天。(用户ID)大概是由系统在后台分配的。
  2. 他们可以加入(订阅)聊天对话。并且他将看到来自其他用户的聊天文本出现在指定区域。
  3. 他们可以回复特定的对话,其他所有人都应该看到。

而已!(请参阅我告诉您的那是一个简单的聊天应用程序)。因此,我的意图并不是真正的应用程序。但是设计模式和其中使用的对象。

现在这是我的设计方式。(我在用java ..编码,以防万一真的很重要)

  1. 用户对象-两个属性ID和昵称
  2. 消息对象-一个简单的消息接口和实现(目前)为SimpleMessage,具有String作为包含消息的属性。
  3. 聊天窗口对象-基本上由用户和消息组成。由于它具有一个用户对象和消息列表。
  4. 聊天会话-再次组成。基本上它将有一个聊天窗口列表。每个聊天窗口都会注册一个聊天会话。聊天会话负责在出现新消息时通知所有聊天窗口。(观察者模式有人吗?)

好吧..现在我通过使ChatWindow实现具有称为“ notify(Message)”方法的“

ChatListener”模式来实现观察者模式。因此,ChatSession会通知每个已注册的ChatWindow。

现在,我想澄清/希望您提出一些意见。1.我还需要对所有聊天窗口都使用注销方法,以防聊天窗口关闭并且不想再收到任何通知。这可能意味着,要么我应该拥有一个仅具有一个实例的“静态”中央注册管理器,然后任何聊天窗口都应该能够通过提供“聊天会话”

ID来注销自身。因此,每个聊天会话都应具有一个ID。(包括在此处)。或者,我也可以在“聊天窗口”中维护一个ChatSession实例,以始终准备好一个实例。(我讨厌单身人士,因为我认为它们不利于哎呀)。另一种方法是不对聊天窗口取消注册控制,而使用聊天窗口,

  1. 这种设计有道理吗?如果您说这是CRAP的一部分,请给我一个更好的方法;您肯定会从我这里得到极大的感谢。除了观察者模式以外,这里可以使用所有模式来进一步简化它或使其变得更好。另外,此设计的任何弱点,如果适当,但可以改进。

  2. 同样,当用户在自己的聊天窗口中键入新消息时;它必须传播到所有聊天窗口,这是聊天会话要做的,但同时;这是否意味着..聊天会话需要获取带有“聊天窗口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

回到顶部