Niedopasowany wzór
Wzorzec blokowania to wzorzec projektowy oprogramowania , który wykonuje akcję na obiekcie tylko wtedy, gdy obiekt znajduje się w określonym stanie. Na przykład, jeśli obiekt odczytuje ZIP , a metoda wywołująca wywołuje metodę get na obiekcie, gdy plik ZIP nie jest otwarty, obiekt „odmówi” na żądanie. Na przykład w języku programowania Java w takich okolicznościach może zostać zgłoszony wyjątek IllegalStateException .
Jest kilku specjalistów [ kto? ] w tej dziedzinie, którzy uważają przeciwstawianie się bardziej antywzorcem niż wzorcem projektowym. Jeśli obiekt nie może obsługiwać swojego interfejsu API , powinien albo ograniczyć interfejs API, tak aby niewłaściwe wywołanie nie było dostępne, albo aby można było wykonać wywołanie bez ograniczeń. Powinno:
- Bądź stworzony w „zdrowym stanie”; [ potrzebne dalsze wyjaśnienia ]
- nie udostępniać się, dopóki nie znajdzie się w zdrowym stanie;
- stać się fasadą i odpowiedzieć obiektowi, który jest w zdrowym stanie.
Stosowanie
Obiekty korzystające z tego wzoru są na ogół tylko w stanie, który jest podatny na chwilowe załamanie, ale przez nieokreślony czas. [ Potrzebne źródło ] Jeśli obiekty mają pozostawać w stanie, który jest podatny na wahania przez znany, skończony okres czasu, preferowany może być strzeżony wzór zawieszenia .
Realizacja
Poniżej znajduje się ogólny, prosty przykład implementacji wzorca blokowania. Jak pokazano w powyższej definicji, zwróć uwagę, w jaki sposób wykorzystywana jest linia „zsynchronizowana”. Jeśli istnieje wiele wywołań metody zadania, tylko jedno będzie kontynuowane, podczas gdy inne wywołania powrócą bez niczego. Kolejną rzeczą wartą odnotowania jest jobCompleted()
. Powodem, dla którego jest zsynchronizowany, jest to, że jedynym sposobem zagwarantowania, że inny wątek zobaczy zmianę w polu, jest zsynchronizowanie całego dostępu do niego. W rzeczywistości, ponieważ jest to zmienna logiczna, można ją pozostawić nie jawnie zsynchronizowaną, a jedynie zadeklarowaną ulotną - aby zagwarantować, że inny wątek nie odczyta przestarzałej wartości z pamięci podręcznej.
klasa publiczna Przykład { private boolean jobInProgress = false ; publiczne nieważne zadanie () { zsynchronizowane ( to ) { if ( jobInProgress ) { return ; } jobInProgress = true ; } // Kod do wykonania zadania trafia tutaj // ... jobCompleted (); } void jobCompleted () { synchronized ( this ) { jobInProgress = false ; } } }