Образец отказа - Balking pattern

В образец отказа это шаблон разработки программного обеспечения который выполняет действие только на объект когда объект находится в определенном состоянии. Например, если объект читает ZIP files, а вызывающий метод вызывает метод get для объекта, когда ZIP-файл не открыт, объект будет «блокировать» запрос. в Ява язык программирования, например, IllegalStateException могут быть брошены при таких обстоятельствах.

Есть несколько специалистов[кто? ] в этой области, кто считает отказ в большей степени антипаттерн чем шаблон проектирования. Если объект не может поддерживать API, он должен либо ограничить API, чтобы вызывающий нарушение вызов был недоступен, либо чтобы вызов мог быть выполнен без ограничений, он должен:

  • Создаваться в «нормальном состоянии»[требуется дальнейшее объяснение ]
  • Не делать себя доступным, пока не будет в нормальном состоянии
  • Стать фасад и ответить объекту, который находится в нормальном состоянии

Применение

Объекты, использующие этот шаблон, обычно находятся только в состоянии, которое может временно блокироваться, но в течение неизвестного периода времени.[нужна цитата ] Если объекты должны оставаться в состоянии, которое склонно к сопротивлению в течение известного конечного периода времени, тогда охраняемая схема подвески может быть предпочтительным.

Реализация

Ниже приведен общий простой пример реализации паттерна отказа.[1] Как показано в приведенном выше определении, обратите внимание, как используется «синхронизированная» линия. Если есть несколько вызовов метода задания, будет продолжен только один, а другие вызовы вернутся ни с чем. Еще стоит отметить jobCompleted () метод. Причина, по которой он синхронизирован, заключается в том, что единственный способ гарантировать, что другой поток увидит изменение в поле, - это синхронизировать весь доступ к нему или объявить его как изменчивое.

общественный класс пример {    частный логический jobInProgress = ложный;    общественный пустота работа() {        синхронизированный(этот) {            если (jobInProgress) {                вернуть;            }            jobInProgress = правда;        }        // Код для выполнения задания находится здесь        // ...        jobCompleted();    }    пустота jobCompleted() {        синхронизированный(этот) {            jobInProgress = ложный;        }    }}

Смотрите также

использованная литература

  1. ^ Гранд, Марк (2002). Шаблоны в Java, Том 1: Каталог шаблонов дизайна многократного использования, иллюстрированный с помощью UML, второе издание. Индианаполис, штат Индиана: John Wiley & Sons.