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  ;  }  }  } 

Zobacz też