И первое, и второе имеет право на жизнь.
Второе действительно используется чаще: у нас есть готовая или полуготовая кнопка, и надо добавить в неё функциональность Нашей Крутой Кнопки™. К тому же слова вроде Clickable лучше подходят для названий интерфейса, чем Button.
class Button {
protected void paint(Canvas aCanvas) {}
}
class MyButton extends Button {
@Override
protected void paint(Canvas aCanvas) {}
}
А первое — например, мы хотим с Нашей Крутой Кнопкой™ работать как с кнопкой неизвестной функциональности, которая умеет только нажиматься и говорить, в каком она состоянии.
interface Button {
void press();
boolean state();
void addListener(ButtonListener x);
}
class GameObject {
void paint(Renderer renderer);
}
class MyButton extends GameObject implements Button {
}
class FridgeGame implements ButtonListener { // помните, такая была в «Братьях Пилотах»?
Button buttons[][] = new MyButton[4][4];
}