Шаблоны проектирования - как следует из их названия - только шаблоны.Их фактическая реализация может сильно различаться в разных приложениях.
В общем, наиболее важным принципом SOLID, связанным с Observer, является принцип открытия / закрытия: после того, как вы написали код наблюдаемого объекта, вам не нужно менятькод, если вы хотите, чтобы дополнительные наблюдатели знали об этом, но добавить таких наблюдателей легко - это именно то, что означает «закрыто для изменений, открыто для расширений».
Это также можно рассматривать как применение зависимостиПринцип инверсии: наблюдаемый субъект применяет известный API, в котором тот, кто хочет его наблюдать, должен следовать некоторым правилам, и, в частности, наблюдаемый субъект будет вызывать свою функцию update()
вместо вызова определенных функций наблюдателей.Таким образом, если наблюдатели должны быть изменены, наблюдаемый класс не имеет ничего общего (сравните это с возможностью вызова конкретной функции наблюдателя).
В базовой классической реализации (т. Е. ИзGoF), могут быть нарушения SRP и ISP.
В этой реализации изменяемый объект отвечает за обновление наблюдателей.Это еще одна ответственность, которую несет класс, в дополнение к его основной ответственности.Таким образом, существует более одной «причины» для обновления класса в будущем - если необходимо изменить механизм обновления (например, использовать другой контейнер, использовать механизм, ориентированный на многопотоковое исполнение и т. Д.), - изменение произойдеттот же класс, который несет совершенно другую основную ответственность.Конечно, это может быть решено путем отделения механизма «Наблюдатель» от другого класса.
Другое возможное нарушение SOLID упрощенной реализацией состоит в том, что в соответствии с этой реализацией GoF каждый обновленный наблюдатель должен затем проверять состояниенаблюдаемого субъекта, чтобы обнаружить изменение.Это может означать, что не существует сегрегации интерфейса, поскольку любой наблюдатель должен подвергаться воздействию всего, что находится в наблюдаемом объекте.Однако он не должен работать таким образом, и очень легко предоставить немного более сложные реализации, которые используют разные интерфейсы для разных наблюдателей.
Шаблон не имеет большого отношения к принципу подстановки Лискова -до тех пор, пока наследование (например, наследование наблюдателя и наблюдаемых типов по конкретным типам) не будет делать то, что они не должны делать, этот принцип будет соблюдаться.