iva*_*off 3 java design-patterns
我有两个类(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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
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.
Run Code Online (Sandbox Code Playgroud)
嗯,它有效,但似乎不是最佳解决方案.
你会怎么做?
是否存在处理此类问题的模式?
编辑:
我想知道它一般.
但是,假设我有一个包含多个Element的Container.Container提供方法remove(someElement),Element也提供方法removeMe().
两种方法都相互依赖,但不能连接到一种方法,因为这两种方法还可以执行一些内部操作,只能在每个类中访问.