我有多个不允许修改对方字段的类,而是必须通过将请求对象添加到Main类的队列来请求修改。在每个循环结束时,Main类将执行请求的修改。“变量赋值请求”对象设计
public class Main {
public static ClassA a = new ClassA();
public static ClassB b = new ClassB();
private static List<Request> requestQueue = new ArrayList<Request>(); // List holds all requests
public static void main(String args[]) {
while (true) {
a.tick();
b.tick();
for (Request r : requestQueue) {
r.field = r.value; // All requests are fulfilled
}
requestQueue.clear();
}
}
public static <ValueType> void addModificationRequest(ValueType field,
ValueType value) {
requestQueue.add(new Request<ValueType>(field, value));
}
}
// Request Object
public class Request<ValueType> {
ValueType field;
ValueType value;
public Request(ValueType field, ValueType value) {
this.field = field;
this.value = value;
}
}
// Classes
public class ClassA {
String name = "A";
public void tick() {
Main.addModificationRequest(Main.b.name, "NewNameB"); // Try to change b name
}
}
public class ClassB {
String name = "B";
public void tick() {
// Nothing
}
}
我知道代码是乱,但它的最简单的方法我已经想到了这么远。有没有人知道任何可以以更简单,更稳健的方式实现这一点的优秀设计模式? (注:我必须这样说,没有允许类直接修改对方的可能性。)
编辑:类将有一个以上的可修改的变量。我还需要确定是否有任何请求尝试修改同一个变量,因此我可以忽略其中的一个或两个。
编辑:感谢所有的帮助,我真的很感激它!我决定让这些课程跟踪他们自己的修改。我也将使用我一直使用的相同的请求对象,因为它很简单直接。再次谢谢你。
有趣的问题。你为什么不能直接修改对象? – Buhb 2011-06-01 04:09:49
请注意,** a **&** b **的滴答功能是如何连续调用的。如果** a **在打勾前允许修改** b **,则会改变** b **的打勾结果。如果有很多班级,我打算有数千人,这会导致巨大的变化。解决方法是在每个循环结束前不要修改,加上主类应该能够对请求进行排序,并且作为示例,引发“ConcurrentModificationException”。 – scientiaesthete 2011-06-01 04:22:10