Durum kalıbı - State pattern
Durum kalıbı , bir nesnenin dahili durumu değiştiğinde davranışını değiştirmesine izin veren davranışsal bir yazılım tasarım kalıbıdır . Bu model, sonlu durum makineleri kavramına yakındır . Durum kalıbı , kalıbın arayüzünde tanımlanan yöntemlerin çağrılması yoluyla bir stratejiyi değiştirebilen bir strateji kalıbı olarak yorumlanabilir .
Durum deseni, aynı nesne için dahili durumuna bağlı olarak değişen davranışları kapsüllemek için bilgisayar programlamasında kullanılır . Bu, bir nesnenin koşullu ifadelere başvurmadan çalışma zamanında davranışını değiştirmesi ve böylece sürdürülebilirliği geliştirmesi için daha temiz bir yol olabilir.
genel bakış
Durum tasarım deseni, yinelenen tasarım problemlerinin nasıl çözüleceğini tanımlayan Dörtlü Çete tarafından belgelenen yirmi üç tasarım deseninden biridir . Bu tür problemler, uygulanması, değiştirilmesi, test edilmesi ve yeniden kullanılması kolay nesneler gibi esnek ve yeniden kullanılabilir nesne yönelimli yazılımların tasarımını kapsar.
Durum kalıbı iki ana sorunu çözmek için ayarlanmıştır:
- Bir nesne, iç durumu değiştiğinde davranışını değiştirmelidir.
- Duruma özgü davranış bağımsız olarak tanımlanmalıdır. Yani, yeni durumlar eklemek, mevcut durumların davranışını etkilememelidir.
Duruma özgü davranışı doğrudan bir sınıf içinde uygulamak esnek değildir, çünkü sınıfı belirli bir davranışa bağlar ve daha sonra sınıftan bağımsız olarak, sınıfı değiştirmeden yeni bir durum eklemeyi veya mevcut bir durumun davranışını değiştirmeyi imkansız kılar. Bu durumda, model iki çözümü açıklar:
- Her durum için duruma özgü davranışı kapsayan ayrı (durum) nesneleri tanımlayın. Yani, duruma özgü davranışı gerçekleştirmek için bir arabirim (durum) tanımlayın ve her durum için arabirimi uygulayan sınıfları tanımlayın.
- Bir sınıf, duruma özgü davranışı doğrudan uygulamak yerine, duruma özgü davranışı geçerli durum nesnesine devreder.
Bu, bir sınıfı duruma özgü davranışın nasıl uygulandığından bağımsız hale getirir. Yeni durum sınıfları tanımlanarak yeni durumlar eklenebilir. Bir sınıf, mevcut durum nesnesini değiştirerek çalışma zamanında davranışını değiştirebilir.
Yapı
Ekteki olarak birleştirilmiş Modelleme Dili (UML) sınıf diyagramı , Contextsınıf doğrudan durum özgü davranış uygulamaz. Bunun yerine, duruma özgü davranışın nasıl uygulandığından bağımsız hale getiren duruma özgü davranışın ( ) gerçekleştirilmesi Contextiçin Statearabirime atıfta bulunur . Ve sınıfları uygulanması (kapsülü), her bir durum için durum özgü davranış uygulamak, bir arayüz. UML sıra diyagramı , çalışma zamanı etkileşimlerini gösterir:
state.operation()ContextState1State2State
ContextFarklı nesne delegeler durum özgü davranış Statenesneleri. İlk olarak, Contextaramalar operation(this)da akım (başlangıç) durum nesnesi (ilgili State1işlem ve aramaları gerçekleştirir) setState(State2)ile Contextdeğiştirin bağlam o anki durumuna State2. Bir dahaki sefere, işlemi gerçekleştiren ve bağlamın mevcut durumunu olarak değiştiren mevcut durum nesnesini ( ) Contexttekrar çağırır .
operation(this)State2State1
Örnek
Java
Durum arayüzü ve iki uygulama. Durumun yöntemi, bağlam nesnesine bir referansa sahiptir ve durumunu değiştirebilir.
interface State {
void writeName(StateContext context, String name);
}
class LowerCaseState implements State {
@Override
public void writeName(StateContext context, String name) {
System.out.println(name.toLowerCase());
context.setState(new MultipleUpperCaseState());
}
}
class MultipleUpperCaseState implements State {
/* Counter local to this state */
private int count = 0;
@Override
public void writeName(StateContext context, String name) {
System.out.println(name.toUpperCase());
/* Change state after StateMultipleUpperCase's writeName() gets invoked twice */
if (++count > 1) {
context.setState(new LowerCaseState());
}
}
}
Bağlam sınıfı, bu durumda, bir başlangıç durumunda somutlaştırdığı bir durum değişkenine sahiptir LowerCaseState. Yönteminde durum nesnesinin karşılık gelen yöntemlerini kullanır.
class StateContext {
private State state;
public StateContext() {
state = new LowerCaseState();
}
/**
* Set the current state.
* Normally only called by classes implementing the State interface.
* @param newState the new state of this context
*/
void setState(State newState) {
state = newState;
}
public void writeName(String name) {
state.writeName(this, name);
}
}
Aşağıdaki gösteri kullanımı göstermektedir:
public class StateDemo {
public static void main(String[] args) {
StateContext context = new StateContext();
context.writeName("Monday");
context.writeName("Tuesday");
context.writeName("Wednesday");
context.writeName("Thursday");
context.writeName("Friday");
context.writeName("Saturday");
context.writeName("Sunday");
}
}
Yukarıdaki kodla, main()from çıktısı StateDemo:
monday TUESDAY WEDNESDAY thursday FRIDAY SATURDAY sunday