【发布时间】:2018-10-15 10:11:14
【问题描述】:
我正在使用观察者模式编写一个简单的群聊程序。
组 1:A、B 和 C 组 2:A 和 C
A 是一个发件人/主题,有两个列表,一个用于 Group1,一个用于 Group2。
在主题类中有两个列表是一种好方法吗?
这是否违反了观察者模式的特性?
一个发送者可以有两组观察者。
public class Sender {
private List<Receiver> group1 = new ArrayList<Receiver>();
private List<Receiver> group2 = new ArrayList<Receiver>();
private String msg;
private String name;
public Sender(String name) {
this.name = name;
}
public void sendMsg(int group, String msg, JTextArea display) {
this.msg = msg;
String output = name + ": " + msg;
display.append(output + "\n\r");
if(group == 1) {
notifyAllObservers(group1);
} else {
notifyAllObservers(group2);
}
}
public void register(int group, Receiver receiver) {
if(group == 1) {
group1.add(receiver);
} else {
group2.add(receiver);
}
}
public void notifyAllObservers(List<Receiver> group) {
for (Receiver receiver : group) {
receiver.update(msg);
}
}
public String toString() {
return name;
}
}
public class Receiver {
public Sender sender;
private JTextArea display;
public Receiver(int group, Sender sender, JTextArea display) {
this.sender = sender;
this.display = display;
this.sender.register(group, this);
}
public void update(String msg) {
display.append(sender.toString() + ": " + msg + "\n\r");
}
}
【问题讨论】:
-
我认为“太宽泛了”。这里有太多假设性问题要先问。比如:这段代码是多线程的吗?请发布代码尝试以及您遇到的问题。
-
@markspace 请看一下
-
为什么不将
Groups 也建模为对象?每个Group可以有一个List<Sender>(并自动注册为每个Sender的观察者)。作为回报,Group可以被观察到,并将其Senders 中的可观察事件转发给它的观察者。这样一来,您就不需要为每个Sender创建多个列表,并且拥有更动态的设置来创建不同大小的新Groups。 -
是的,我同意 Turing85 的观点,
ChatGroup应该是一个可以封装自己的观察者列表的对象。然而,像这样的代码改进是基于意见的。我建议你试试代码审查网站:codereview.stackexchange.com -
@desperatecoder 到底哪一部分你不明白?
标签: java design-patterns observers