09.04.2016 Views

Priemioop

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

void TCPState: : Close (TCPConnection*) { }<br />

void TCPState: : Synchronize (TCPConnection*) { }<br />

Паттерны поведения<br />

void TCPState: :ChangeState (TCPConnection* t, TCPState* s) {<br />

t->ChangeState(s) ;<br />

}<br />

В подклассах TCPState реализовано поведение, зависящее от состояния. Соединение<br />

TCP может находиться во многих состояниях: Established (установлено),<br />

Listening (прослушивание), Closed (закрыто) и т.д., и для каждого из<br />

них есть свой подкласс TCPState. Мы подробно рассмотрим три подкласса -<br />

TCPEstablished, TCPListen и TCPClosed:<br />

class TCPEstablished : public TCPState {<br />

public:<br />

static TCPState* Instanced;<br />

};<br />

virtual void Transmit (TCPConnection*, TCPOctetStream*) ;<br />

virtual void Close (TCPConnection*) ;<br />

class TCPListen : public TCPState {<br />

public:<br />

static TCPState* Instance();<br />

};<br />

virtual void Send(TCPConnection*);<br />

// ...<br />

class TCPClosed : public TCPState {<br />

public:<br />

static TCPState* Instanced;<br />

};<br />

virtual void ActiveOpen(TCPConnection*);<br />

virtual void PassiveOpen(TCPConnection*);<br />

// ...<br />

В подклассах TCPState нет никакого локального состояния, поэтому их можно<br />

разделять, так что потребуется только по одному экземпляру каждого класса.<br />

Уникальный экземпляр подкласса TCPState создается обращением к статической<br />

операции Instance. 1<br />

В подклассах TCPState реализовано зависящее от состояния поведение для<br />

тех запросов, которые допустимы в этом состоянии:<br />

void TCPClosed::ActiveOpen (TCPConnection* t) {<br />

// послать SYN, получить SYN, ACK и т.д.<br />

)<br />

ChangeState(t,<br />

TCPEstablished::Instanced);<br />

Таким образом, каждый подкласс TCPState - это одиночка.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!