Да, у вас есть как минимум две опции:
1- Шаблон посетителя Этот шаблон полезен, если вы хотите выполнять операции над объектом без его изменения. Вы можете определить объект для каждой ячейки в судоку и разрешить его посещение предопределенному посетителю. Для этого вы можете, например, рекурсивно найти следующий объект в предварительно определенном списке (карте) объектов и затем выполнить нужную операцию. Хорошим вариантом является применение его в сочетании с Pattern итератора .
2- Цепочка ответственности Этот шаблон полезен, если вы хотите, чтобы каждая ячейка выполняла операцию и имела контроль над алгоритмом. Вы должны создать цепочечную структуру, и после того, как текущая ячейка выполнит операцию «сравнить значения», рекурсивно вызывается цепочка, выполняющая эту проверку.
Как я уже сказал, оба полезны, если вы хотите «инвертировать» Observer. поведение.