stringtranslate.com

Модель уклонения

Шаблон отказа — это шаблон проектирования программного обеспечения , который выполняет действие над объектом только тогда, когда объект находится в определенном состоянии. Например, если объект читает файлы ZIP , а вызывающий метод вызывает метод get на объекте, когда файл ZIP не открыт, объект «откажется» от запроса. Например, в языке программирования JavaIllegalStateException при таких обстоятельствах может возникнуть исключение .

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

Использование

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

Выполнение

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

Пример открытого класса { private boolean jobInProgress = false ;         public void job () { synchronized ( this ) { if ( jobInProgress ) { return ; } jobInProgress = true ; } // Код для выполнения задания находится здесь // ... jobCompleted (); }                   void jobCompleted () { synchronized ( this ) { jobInProgress = false ; } } }         

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

Ссылки

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