Образец отказа
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Шаблон отказа — это шаблон проектирования программного обеспечения , который выполняет действие над объектом только тогда, когда объект находится в определенном состоянии. Например, если объект читает ZIP- файлы, а вызывающий метод вызывает метод get для объекта, когда ZIP-файл не открыт, объект «откажется» выполнить запрос. в языке программирования Java Например, IllegalStateException
может быть брошен при таких обстоятельствах.
Есть специалисты [ ВОЗ? ] в этой области, которые считают отказ скорее анти-шаблоном, чем шаблоном проектирования. Если объект не может поддерживать свой API , он должен либо ограничить API, чтобы вызывающий нарушение вызов был недоступен, либо чтобы вызов можно было выполнить без ограничений. Должно:
- Быть созданным в «вменяемом состоянии»; [ нужны дальнейшие объяснения ]
- не предоставлять себя, пока он не будет в нормальном состоянии;
- стать фасадом и ответить объекту, находящемуся в нормальном состоянии.
Использование
[ редактировать ]Объекты, использующие этот шаблон, обычно находятся в состоянии, в котором возможно временное блокирование, но на неизвестный период времени. [ нужна ссылка ] Если объекты должны оставаться в состоянии, которое склонно к блокировке, в течение известного, конечного периода времени, то шаблон защищенной приостановки может быть предпочтительным .
Выполнение
[ редактировать ]Ниже приведен общий и простой пример реализации шаблона отказа. [1] Как показано в приведенном выше определении, обратите внимание, как используется «синхронизированная» линия. Если существует несколько вызовов метода задания, продолжится только один, а остальные вызовы вернутся ни с чем. Еще одна вещь, которую следует отметить, это jobCompleted()
метод. Причина, по которой он синхронизируется, заключается в том, что единственный способ гарантировать, что другой поток увидит изменение поля, — это синхронизировать весь доступ к нему. На самом деле, поскольку это логическая переменная, ее можно оставить не синхронизированной явно, а только объявить изменчивой - чтобы гарантировать, что другой поток не прочитает устаревшее кэшированное значение.
public class Example {
private boolean jobInProgress = false;
public void job() {
synchronized(this) {
if (jobInProgress) {
return;
}
jobInProgress = true;
}
// Code to execute job goes here
// ...
jobCompleted();
}
void jobCompleted() {
synchronized(this) {
jobInProgress = false;
}
}
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Гранд, Марк (2002). Шаблоны в Java, Том 1: Каталог повторно используемых шаблонов проектирования, иллюстрированный с помощью UML, второе издание . Индианаполис, Индиана: Джон Уайли и сыновья.