
Лаб_8 Головков И.Е. 12002108 Фасад
.docxБЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ
ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ»
(НИУ «БелГУ»)
ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
Кафедра информационных и робототехнических систем
Отчет по лабораторной работе № 8 по дисциплине «Методы и средства проектирования информационных систем и технологий»
Вариант № 3
Тема работы «Фасад»
студента очного отделения
3 курса 12002108 группы
Головкова Игоря Евгеньевича
Проверил:
асс. Пузырев Никита Сергеевич
БЕЛГОРОД, 2024
Вариант 3:
Создать класс реактивного двигателя. Класс содержит поля силы которую создает двигатель и расход топлива в секунду. Данные поля инициализируются в конструкторе. У класса есть метод включения двигателя на определенное количество секунд который возвращает количество сожжённого топлива.
Создать класс бака с топливом. Бак имеет поля объема бака и оставшегося топлива. Поля инициализируются в конструкторе. Существует метод уменьшения топлива в баке в который передается количество использованного топлива.
Создать класс-фасад ракеты. Ракета состоит из двух двигателей(левый и правый) и бака. В данном классе есть поля массы ракеты и скорости ракеты, оно инициализируется в конструкторе. Создать методы разгона ракеты по прямой с помощью двигателей до определённой скорости. Ускорение, создаваемое двигателями считать по формуле a = F/m. При этом топливо в баке должно уменьшаться. Производить проверки на колличество топлива.
Разработать UML диаграмму классов. Продемонстрировать работу класса ракеты.
Диаграмма классов для программы представлена на рисунке 1.
Рисунок 1 – Диаграмма классов
Результат работы программы, использующей паттерн фасад, представлена на рисунке 2.
Рисунок 2 – Результат работы программы, использующей паттерн фасад
// Интерфейс FuelTank @Getter public class FuelTank { private final int volume; private int currentFuelVolume; public FuelTank(int volume, int currentFuelVolume) { if (currentFuelVolume > volume || currentFuelVolume < 0) { throw new IllegalArgumentException("Невозможное значение текущего объёма топлива"); } this.volume = volume; this.currentFuelVolume = currentFuelVolume; } public void consumeFuelForSecond(int consumedFuelVolume) { currentFuelVolume -= consumedFuelVolume; } }
// Класс ReactiveEngine
@AllArgsConstructor @Getter public class ReactiveEngine { private int force, fuelConsumption; public int useEngine(int seconds) { return seconds * fuelConsumption; } }
// Класс Rocket public class Rocket { private final ReactiveEngine leftReactiveEngine = new ReactiveEngine(100_000, 100), rightReactiveEngine = new ReactiveEngine(100_000, 100); private final FuelTank fuelTank = new FuelTank(100_000, 100_000); private final double weight; private double speed = 0; public Rocket(int weight) { this.weight = weight; } public void accelerateForSecond() { // a = f/m double acceleration = (float) (leftReactiveEngine.getForce() + rightReactiveEngine.getForce()) / (weight + fuelTank.getCurrentFuelVolume()); fuelTank.consumeFuelForSecond(leftReactiveEngine.getFuelConsumption() + rightReactiveEngine.getFuelConsumption()); speed += acceleration; System.out.println(STR.""" Ускорение ракеты:\{acceleration} Скорость ракеты:\{speed}, Топлива в баках:\{fuelTank.getCurrentFuelVolume()} """); } }
// Класс Main public class Main { public static void main(String[] args) { Rocket rocket = new Rocket(10_000); for (int i = 0; i < 5; i++) { rocket.accelerateForSecond(); } } }