Один из способов сделать это - делегировать реализацию самому объекту. Например, если все классы A
, B
и C
отображаются по-разному, каждый из них может иметь интерфейс, такой как:
interface IRenderable {
public void render();
}
Тогда каждый из них предоставит свою собственную реализацию render()
. Чтобы отобразить List
из IRenderable
, вам нужно будет только перебрать его элементы и вызвать метод render()
каждого из них.
Используя этот подход, вам никогда не придется явно проверять тип объекта. Это особенно полезно, если любой из ваших классов когда-либо разделен на подклассы. Предположим, у вас был класс classD
, который расширяет classA
и должен был отображаться иначе, чем A
. Теперь код как:
if (obj instanceof classA) return strategyA;
...
else if (obj instanceof classD) return strategyD;
не удастся - вам всегда нужно проверять порядок от наиболее до наименее конкретных. Лучше не думать о таких вещах.
Редактировать : в ответ на ваш комментарий - если ваша цель состоит в том, чтобы исключить код переднего плана из объектов модели, но вы все еще хотите избежать явных проверок, вы можете использовать посетителя рисунок .
Примерно так:
class Renderer {
public void visit(classA obj);
public void visit(classB obj);
// etc
}
и
class classA {
public void accept(Renderer r) {
r.visit(this);
}
}
Теперь весь код рендеринга переходит в Renderer
, и объекты модели выбирают, какой метод вызывать.