classDiagram
    class Клетка {
        +int x, y
        +bool стена, старт, выход
        +int вес
        +проходима()
    }
    class Лабиринт {
        +int ширина, высота
        +Клетка[][] клетки
        +Клетка стартоваяКлетка, выходнаяКлетка
        +получитьКлетку(x,y)
        +получитьСоседей(клетка)
        +установитьСтарт(x,y)
        +установитьВыход(x,y)
    }
    class СтроительЛабиринта {
        <<интерфейс>>
        +построитьИзФайла(имяФайла)
    }
    class СтроительИзТекстовогоФайла {
        +построитьИзФайла(имяФайла)
    }
    class СтратегияПоискаПути {
        <<интерфейс>>
        +найтиПуть(лабиринт, старт, выход)
    }
    class ПоискВШирину
    class ПоискВГлубину
    class Астар
    class Дейкстра
    class РешательЛабиринта {
        -Лабиринт лабиринт
        -СтратегияПоискаПути стратегия
        +установитьСтратегию(стратегия)
        +решить() СтатистикаПоиска
    }
    class СтатистикаПоиска {
        +int длинаПути
        +int посещеноКлеток
        +float времяМс
    }
    class Наблюдатель {
        <<интерфейс>>
        +обновить(событие, данные)
    }
    class КонсольноеПредставление {
        +обновить(событие, данные)
        -отобразить()
    }
    class Команда {
        <<интерфейс>>
        +выполнить()
        +отменить()
    }
    class КомандаПеремещения {
        -Игрок игрок
        -Лабиринт лабиринт
        -String направление
        +выполнить()
        +отменить()
    }
    class Игрок {
        +Клетка позиция
        +переместитьсяВ(клетка)
    }
    class КонтроллерИгры {
        -List наблюдатели
        -Stack команды
        +подписать(наблюдатель)
        +уведомить(событие, данные)
        +выполнитьКоманду(команда)
        +отменить()
    }

    СтроительЛабиринта <|-- СтроительИзТекстовогоФайла
    СтратегияПоискаПути <|-- ПоискВШирину
    СтратегияПоискаПути <|-- ПоискВГлубину
    СтратегияПоискаПути <|-- Астар
    СтратегияПоискаПути <|-- Дейкстра
    РешательЛабиринта --> СтратегияПоискаПути
    РешательЛабиринта --> Лабиринт
    Лабиринт --> Клетка
    КонтроллерИгры --> Игрок
    КонтроллерИгры --> Команда
    КонтроллерИгры --> Наблюдатель
    КомандаПеремещения --> Игрок
    КомандаПеремещения --> Лабиринт
    КонсольноеПредставление ..|> Наблюдатель