Шаблоны проектирования: уменьшите дублирующийся код из двух методов, которые почти одинаковы в Java - PullRequest
1 голос
/ 24 октября 2011

У меня есть несколько классов транспортных средств, таких как грузовик, седан, фургон, мотоцикл.Общим для них является то, что все они перемещаются, поэтому я делегирую его классу перемещения, который содержит следующие методы:

getSpeed()
setSpeed()
getDestination()
setDestination()
..
..
..
move()

Некоторые транспортные средства движутся не так, как другие, поэтому я делаю для них шаблон проектирования завода.Поэтому, если это будет автомобиль (грузовик, седан, фургон), он будет делегирован классу MoveCarImpl или, если это мотоцикл, он делегирует классу MoveBikeImpl.Моя проблемаУ велосипеда и автомобиля практически одинаковый алгоритм move ().Единственное отличие состоит в том, что алгоритм bike вызывает 1 дополнительный метод в конце метода move (), а алгоритм move () автомобиля - нет.Так что теперь у меня много дублирования кода в классе MoveCarImpl и классе MoveBikeImpl.Есть идеи как с этим бороться?

Ответы [ 6 ]

2 голосов
/ 24 октября 2011

Переместите общий код между MoveCarImpl и MoveBikeImpl в базовом классе MoveImpl. Унаследуйте от него и автомобиль Move, и велосипед Move, и для каждого метода вызовите метод базового класса, а затем выполните дополнительный вызов определенного метода.

2 голосов
/ 24 октября 2011

Вы можете расширить свой класс реализации перемещения автомобиля с помощью класса реализации перемещения велосипеда и переопределить метод перемещения.

0 голосов
/ 24 октября 2011

Другой вариант для класса Move - содержать указатель на класс Vehicle.(Вы передадите его в конструктор и сохраните его как переменную-член. Возможно, вы найдете полезными Generics.) Класс Move может вызывать обратно класс Vehicle для некоторого поведения, специфичного для транспортного средства, - обрабатывая класс Vehicle кактип стратегии.

0 голосов
/ 24 октября 2011

Как бы я ни уважал ваше решение использовать делегирование вместо наследования, я обнаружил, что наличие двух иерархий классов, параллельных друг другу, является запахом кода. Если вы обнаружите, что добавление нового типа транспортного средства в систему требует добавления двух (или более) классов в независимые иерархии наследования, тогда, возможно, пришло время пересмотреть решение о делегировании, а не наследовании.

0 голосов
/ 24 октября 2011

вы можете создать класс Move и написать свой метод move в этом классе.расширить два класса CarMove и Bike move из класса move CarMove унаследует метод, не нужно ничего делать, класс BikeMove может переопределить метод move (), переопределенный метод может вызвать метод super move и затем метод endMove (), поскольку endMove ()должен быть вызван в конце.

, и у вас будет возможность добавить другие классы Move для грузовика, седана и т. д., которые могут наследоваться от класса Move.

0 голосов
/ 24 октября 2011

Вы можете иметь класс util и иметь в нем метод с общим кодом, используемым как машиной, так и велосипедом, но при вызове moveBikeImpl этот дополнительный метод следует после метода этого класса утилит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...