Android多态:反模式?

我正在阅读O'Reilly的“编程Android”一书,我正试图围绕从第99页开始的“覆盖和callback”部分进行讨论。他们用这个代码作为一个好代码的例子:

public class MyModel { public MyModel(TextView textBox) { textBox.addTextChangedListener( new TextWatcher() { public void afterTextChanged(Editable s) { handleTextChange(s); } // ... } void handleTextChange(Editable s) { // do something with s, the changed text. } } 

后来由于缺乏可扩展性封装,将其称为反模式:

 public class MyModel implements TextWatcher { public MyModel(TextView textBox) { textBox.addTextChangedListener(this); } public void afterTextChanged(Editable s) { handleTextChange(s); } // ... void handleTextChange(Editable s) { // do something with s, the changed text. } } 

我没有看到两者之间的function差异,除了第二个可读性更强。 两者都采用TextView,并实现一个处理函数来覆盖。 第二个不会像这样容易地扩展吗?

 public class AnotherModel extends MyModel { @Override void handleTextChange(Editable s) { // another implementation } } 

Solutions Collecting From Web of "Android多态:反模式?"

由于缺乏可扩展性而导致的反模式

可扩展性方面,他们是相似的,这两种方法让子类轻松修改现有的TextChangeListener通过重写handleTextChange ; 但是它们不同,因为只有方法#2也使得子类很容易添加新的 TextChangeListener而不修改现有的(inheritance的)。

即使超类使用方法#1,子类仍然可以使用方法#2添加新的TextChangeListener ; 但是如果我们谈论一般使用的模式,那么一致地使用方法#2将比一致地使用方法#1提供更多的可扩展性。

我不喜欢第二种forms,因为类实现了一个接口作为技巧,并不是因为类自然是接口的子types。

第二种forms对于简单的情况是可以pipe理的,所以它可以,除非太乱。

在Java 8中,我们可以用更好的语法使用第一种forms:

  textBox.addTextChangedListener(this#handleTextChange); // method reference