【发布时间】:2009-06-06 23:20:41
【问题描述】:
我有两个类(A 和 B),它们在以下意义上相互依赖:
每个类都有一个执行某些操作的方法。
每个类的动作依赖于另一个类的动作。
所以,如果用户调用A类的动作,它应该自动调用
B类的行动。
其他方式也一样。但是应该防止无限循环。
我找到了一些处理这个问题的代码,但它似乎是一个 对我来说有点愚蠢:锁定可以防止无限循环。
import java.util.concurrent.locks.*;
import static java.lang.System.*;
import org.junit.*;
public class TEST_DependentActions {
static class A {
private B b = null;
private final ReentrantLock actionOnBLock = new ReentrantLock();
public void setB(B b) {
this.b = b;
}
public void actionOnB() {
if (!actionOnBLock.isLocked()) {
actionOnBLock.lock();
b.actionOnA();
actionOnBLock.unlock();
}
}
}
static class B {
private A a = null;
private final ReentrantLock actionOnALock = new ReentrantLock();
public void setA(A a) {
this.a = a;
}
public void actionOnA() {
if (!actionOnALock.isLocked()) {
actionOnALock.lock();
a.actionOnB();
actionOnALock.unlock();
}
}
}
@Test
public void test1()
throws Exception {
out.println("acting on class A first:");
A a = new A(); B b = new B();
a.setB(b); b.setA(a);
a.actionOnB();
}
@Test
public void test2()
throws Exception {
out.println("acting on class B first:");
A a = new A(); B b = new B();
a.setB(b); b.setA(a);
b.actionOnA();
}
}
输出如下:
acting on class A first:
A : calling class B's action.
B : calling class A's action.
acting on class B first:
B : calling class A's action.
A : calling class B's action.
嗯,它有效,但似乎不是最佳解决方案。
你会怎么做?
是否有处理此类问题的模式?
编辑:
我想大致了解一下。
但是,假设我有一个 Container,其中包含多个 Element。
Container 提供方法 remove(someElement) 和
Element 还提供了一个方法 removeMe()。
两种方法相互依赖,但不能连接到一个
方法,因为这两种方法都额外执行一些内部工作,这只是
内部每个类都可以访问。
【问题讨论】:
标签: java design-patterns