假设以下情况:
public interface A {
void a1();
void a2();
}
public interface B {
void b1(A a);
}
public class ImplA implements A {
// interface methods
void a1() {};
void a2() {};
// ImplA specific methods
void a3() {};
}
public class ImplB implements B {
void b1(A a) {
if(a instaceof ImplA) { // avoid instanceof test and cast
((ImplA)a).a3();
}
}
}
一些架构巫毒是否可以避免在ImplB.b1()中检查实例? ImplA和ImplB在同一个包中并且彼此密切相关。我在某处读到,使用instanceof是一个“不那么好”的界面设计的暗示。有什么建议?非常感谢!
答案 0 :(得分:1)
您可以使用访问者模式来避免实例强制转换
public interface Visitor {
void visitImplA(ImplA toVisit);
}
public class VisitorImpl implements Visitor {
@Override
public void visitImplA(ImplA toVisit) {
toVisit.a3();
}
}
public interface A {
void a1();
void a2();
void accept(Visitor visitor);
}
public interface B {
void b1(A a);
}
public class ImplA implements A {
// interface methods
void a1() {};
void a2() {};
// ImplA specific methods
void a3() {};
void accept(Visitor visitor) {
visitor.visitImplA(this);
}
}
public class ImplB implements B {
void b1(A a) {
a.accept(new VisitorImpl());
}
}
这将消除你所有的检查实例并将它们分成访问者和实现类,这种模式就足以满足你在大多数检查实例之后做同样的事情,否则你就会#39 ; d需要很多Visitor接口的实现
答案 1 :(得分:1)
你想要的VooDoo是作曲。您可以使用Visitor dessign模式解决这个问题。但是当你使用它时会受到一些惩罚。或者,您可以创建将用于调用该a3方法的onther接口。
案件varry。问题的原因可能是你的架构没有组成,你试图做一些奇怪的事情或你的班级执行很多事情。