如何避免在这个"访客"中使用instanceof图案?

时间:2014-09-03 18:25:37

标签: java oop instanceof

有多种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语句那样,只检查它是否合法执行该方法。但是,这似乎是错误的。有任何想法吗?

0 个答案:

没有答案