Почему MouseAdapter адаптер?
Название (и javadocs) подразумевает, что MouseAdapter
является адаптером (шаблон проектирования). Но я не вижу его как такового - он ничего не приспосабливает ни к чему, на первый взгляд, по крайней мере
Единственное, что происходит, это то, что вы можете передать экземпляр MouseAdapter
любому методу, ожидающему любого из интерфейсов. Таким образом, вы можете использовать экземпляр MouseListener
, где ожидается только MouseMotionListener
. Но "перевод" не происходит. И он не соответствует UML GoF - в версии "адаптера класса" ожидается, что вызов одного метода вызывает метод от адаптируемого.
Итак, это адаптер (шаблон дизайна), или это просто случайное имя, которое вызывает путаницу?
Ответы
Ответ 1
MouseAdapter
впервые появился в Java 1.1, выпущенном в Feb 1997. Это означает, что он был разработан где-то в 1996 году (или 1995?)
UML (в своем проекте) был завершен к 1997 году.
Первая книга GoF по шаблонам проектирования была опубликованной в 1995 году.
Итак, я не думаю, что адаптер в MouseAdapter
имел какое-либо отношение к соответствующему шаблону проектирования. Или, даже если это было сделано, разработчики просто не имели единого языка для выражения шаблонов проектирования, которые затрудняли бы понимание реального смысла.
Ответ 2
Да, это не адаптер в смысле шаблона GoF, потому что он ничего не адаптирует.
Его можно считать экземпляром шаблона абстрактного класса [woolf97]:
Суперкласс может обеспечить полную реализацию, которая по умолчанию или минимальной реализации.
Ответ 3
Как говорили другие ответы, это не шаблон адаптера GoF. Основная цель этого заключается в том, чтобы позволить реализовать MouseListener
(или MouseMotionListener
), переместив только нужные методы в MouseAdapter
(часто просто mouseClicked()
), вместо того, чтобы создавать бессмысленные пустые реализации всех другие методы. Поэтому он сохраняет много ненужного кода, особенно при использовании анонимных прослушивателей событий. Например (взято из здесь)
someObject.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
...//Event listener implementation goes here...
}
});
Ответ 4
Я знаю, что уже есть принятый ответ на этот вопрос, но здесь был задан тот же вопрос:
MouseAdapter: какой шаблон использует?
См. там больше деатилов, но MouseAdapter адаптирует интерфейс awkaward MouseListener в более удобную форму.