有多种Controller类型可以实现零,一个或多个接口,例如Updateable和Publishable
public class Controller {
private void doSomeProcessing() {
//do some processing
}
}
public class ArticleController extends Controller implements Publishable {
public void publish() {
this.doSomeProcessing();
//TODO: actually publish article
}
}
public class HeadlineController extends Controller implements Publishable, Updateable {
public void publish() {
this.doSomeProcessing();
//TODO: actually publish headline
}
public void update() {
this.doSomeProcessing();
//TODO: actually update headline
}
}
这些接口的实现中的某些任务可能包含许多或所有Controller类型共有的代码,还有一些对于那种Controller类型唯一的代码。可以有一个名为Visitor(可能不正确)的单件监督器,它可以完成所有更新并调用Controller的更新,而不是在所有可更新(重复代码)的实现中都有doSomeProcessing()。
public void update(Controller c) {
if (c instanceof Updateable) {
c.doSomeProcessing();
((Updateable)c).update(); //updateable code specific to this controller
}
}
避免使用instanceof需要类转换,这也很糟糕:
public void update(Updateable c) {
((Controller)c).doSomeProcessing();
c.update(); //updateable code specific to this controller
}
请注意,在这种情况下,instanceof并不像instanceof的“坏”用法的大多数示例那样“糟糕”。这是因为它不是像switch语句那样,只检查它是否合法执行该方法。但是,这似乎是错误的。有任何想法吗?