Шаблон проектирования для этого варианта использования - PullRequest
3 голосов
/ 10 марта 2020

У меня есть несколько фигур для рисования, таких как прямоугольник, квадрат, круг и т. Д. c, и это число фигур может увеличиться до 20 или более. Нужно ли создавать разные классы для всех этих фигур и реализовывать Shape. Этот метод дал бы мне много классов, которые я не предпочитаю.

Есть ли какой-либо шаблон проектирования, который может лучше справиться с такой ситуацией?

У нас есть такие фигуры, с разными объектами внутри каждого форма. Диаграмма

Ответы [ 2 ]

1 голос
/ 11 марта 2020

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

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

A Shape, однако, не обязательно должен быть объектом, который реализует одну конкретную форму, такую ​​как квадрат или trialngle. Ваш Shape может иметь метод render(), это зависит от индивидуальных реализаций, чтобы решить как они делают это рендеринг.

Вы можете, например, иметь Bitmap implements Shape, который сохраняет свойство file и реализует render() путем отображения изображения, а также имеет Polygon implements Shape, который хранит список Point объектов и реализует render() путем рисования линий между этими точками.

Возможно, все же имеет смысл просто начать с прямоугольника и круга, хотя (или с какой бы формы вы ни начинали), если это самое простое решение. Подумайте об этом так: что если окажется, что вам когда-нибудь понадобятся только круг и прямоугольник, и больше не нужно больше фигур? Если дело обстоит именно так, и вы потратили пять месяцев на решение, которое может безупречно передать самые гениальные формы, вы потратили впустую пять месяцев. Если действительно окажется, что разнообразие форм со временем резко возрастает, вы будете рады видеть весь код вашего клиента только в зависимости от концепции Shape: вы просто передаете Polygon или Bitmap вместо Rectangle или Square, и код клиента просто продолжает работать.

1 голос
/ 10 марта 2020

Смесь подклассов и параметров, кажется, подходит для этой проблемы.

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

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

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

...