State pattern-i obyektə daxili vəziyyət dəyişəndə davranışını dəyişməyə imkan verir. Hər metodda yoxlanılan status sətri əvəzinə hər vəziyyət həmin vəziyyətin davranışını saxlayan sinifə çevrilir, obyekt isə cari vəziyyət obyektinə həvalə edir. Bu, sonlu avtomatın obyektyönlü formasıdır.

Diaqramdan başlayın

Sifariş vəziyyətləri `New`, `Paid`, `Shipped`, `Cancelled` və aralarındakı hadisələr
Sifariş vəziyyətləri New, Paid, Shipped, Cancelled və aralarındakı hadisələr

Sifariş New, sonra Paid, sonra Shipped olur; göndərilməzdən əvvəl ləğv oluna bilər. Shipped və Cancelled sonludur: onlardan heç bir hadisə çıxmır. Diaqram bütün vəziyyətləri, icazəli hadisələri və keçidləri sadalayır; çəkilməyən hər şey icazəsizdir.

Status sətri

Birinci variant status saxlayır və onu hər metodda yoxlayır. İşləyir, lakin yeni vəziyyət bütün metodlara toxunur, keçid qaydaları isə if-lərə və sətirlərə səpələnir ("shiped" kimi səhv səssiz xətadır).

python
class Order:
    def __init__(self):
        self.status = "new"

    def pay(self):
        if self.status != "new":
            raise ValueError(f"cannot pay in state {self.status}")
        self.status = "paid"

    def ship(self):
        if self.status != "paid":
            raise ValueError(f"cannot ship in state {self.status}")
        self.status = "shipped"

    def cancel(self):
        if self.status in ("shipped", "cancelled"):
            raise ValueError(f"cannot cancel in state {self.status}")
        self.status = "cancelled"