Введение в паттерны проектирования
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 45 из 65.
Шаблон проектирования — это известный, имеющий название способ организации классов для задачи, которая повторяется от программы к программе. Это не библиотека и не код для копирования: он описывает, какие объекты существуют, за что отвечает каждый из них и как они взаимодействуют. Ты сам пишешь код, адаптируя его под свою игру.
Шаблоны также дают разработчикам общий язык. Фраза «Враги создаются фабрикой» или «Полоса здоровья наблюдает за игроком» объясняет коллеге, как организован код, ещё до того, как он откроет файл.
Вот проблему, которую решает паттерн. Чтобы начать уровень, нужно взаимодействовать с тремя объектами, и каждый скрипт, запускающий уровень, повторяет эти строки:
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
music.play("forest.ogg")
level_map.load_map(1)
hud.show_hearts(3)Паттерн Facade помещает перед этими объектами один класс и предоставляет ему один простой метод:
# game_facade.gd
class_name GameFacade
extends RefCounted
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
func start_level(number: int) -> void:
music.play("forest.ogg")
level_map.load_map(number)
hud.show_hearts(3)# main.gd
var game := GameFacade.new()
game.start_level(1)Music: playing forest.ogg
Map: level 1 loaded
HUD: hearts 3Остальная часть программы вызывает start_level(), а когда способ запуска уровня меняется, вы редактируете один файл.
Паттерны сгруппированы по решаемой ими проблеме:
- Порождающие паттерны определяют, как создаются объекты: Singleton, Factory.
- Структурные паттерны объединяют объекты в более крупные структуры: Facade, Adapter, Decorator, Composite.
- Поведенческие паттерны организуют взаимодействие объектов: Observer, Strategy, Command, Template Method, State.
В этой и следующей главе рассматриваются эти шаблоны. Каждый из них построен на том, что вы уже знаете: классы в отдельных файлах, наследование, полиморфизм, композиция и сигналы.
Задание
ЛегкоИгра запускает и завершает уровни с помощью трёх уже написанных объектов: MusicPlayer (music_player.gd), LevelMap (level_map.gd) и Hud (hud.gd). Напиши фасад GameFacade, который будет управлять ими:
- Он создаёт по одному объекту
MusicPlayer,LevelMapиHudв своих переменных-членах. start_level(number, hearts)воспроизводит дорожкуlevel_N.ogg(N — номер уровня) илиboss.ogg, если номер кратен5, затем загружает карту этого уровня, а после этого показывает сердца.quit_level()скрывает HUD, а затем останавливает музыку.
Предоставленный код считывает количество следующих команд, а затем по одной команде в каждой строке: start NUMBER HEARTS или quit. Для start 5 2 и quit вывод будет таким:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedТвой код нужно написать в game_facade.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя изменять.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
var game := GameFacade.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "start":
game.start_level(int(parts[1]), int(parts[2]))
elif parts[0] == "quit":
game.quit_level()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript