Редактирование: Design Patterns
Материал из Wiki.crossplatform.ru
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 819: | Строка 819: | ||
public: | public: | ||
CObserver(CModel *pMod) | CObserver(CModel *pMod) | ||
- | + | { | |
m_pModel = pMod; | m_pModel = pMod; | ||
- | + | m_pModel->attach(this); | |
} | } | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
virtual void update() = 0; | virtual void update() = 0; | ||
protected: | protected: | ||
Строка 889: | Строка 883: | ||
== Посредник (Mediator) == | == Посредник (Mediator) == | ||
== Состояние (State) == | == Состояние (State) == | ||
- | <source lang="cpp">#include <iostream> | + | <source lang="cpp"> |
+ | #include <iostream> | ||
class CSocket; | class CSocket; | ||
Строка 901: | Строка 896: | ||
virtual ~CState() {} | virtual ~CState() {} | ||
- | + | virtual void open(CSocket *s) { std::cout << "Open socket" << std::endl; } | |
- | virtual void read(CSocket *s) { std::cout << " | + | virtual void read(CSocket *s) { std::cout << "Read socket" << std::endl; } |
- | + | virtual void close(CSocket *s) { std::cout << "Close socket" << std::endl; } | |
}; | }; | ||
Строка 911: | Строка 906: | ||
public: | public: | ||
CSocket(); | CSocket(); | ||
- | + | void setCurrent(CState *p){ m_pCurrentState = p; } | |
- | + | void open() { m_pCurrentState->open(this); } | |
- | void read() { m_pCurrentState->read(this); } | + | void read() { m_pCurrentState->read(this); } |
void close() { m_pCurrentState->close(this); } | void close() { m_pCurrentState->close(this); } | ||
}; | }; | ||
Строка 923: | Строка 918: | ||
~CStateOpen(){ std::cout << " ~CStateOpen" << std::endl; } | ~CStateOpen(){ std::cout << " ~CStateOpen" << std::endl; } | ||
virtual void read(CSocket *s); | virtual void read(CSocket *s); | ||
- | + | virtual void close(CSocket *s); | |
}; | }; | ||
Строка 932: | Строка 927: | ||
~CStateRead(){ std::cout << " ~CStateRead" << std::endl; } | ~CStateRead(){ std::cout << " ~CStateRead" << std::endl; } | ||
virtual void open(CSocket *s) { std::cout << " Socket already open..." << std::endl; } | virtual void open(CSocket *s) { std::cout << " Socket already open..." << std::endl; } | ||
- | + | virtual void close(CSocket *s); | |
}; | }; | ||
Строка 972: | Строка 967: | ||
int main() | int main() | ||
{ | { | ||
- | + | void(CSocket::*ptrs[])() = { &CSocket::open, &CSocket::read, &CSocket::close }; | |
- | + | CSocket sock; | |
- | + | int num; | |
- | + | while( 1 ) | |
- | + | { | |
- | + | std::cout << "Enter 0/2: "; | |
- | + | std::cin >> num; | |
- | + | (sock.*ptrs[num])(); | |
- | + | } | |
}</source>В данном случае классами состояния являются: CStateOpen, CStateRead и CStateClose. Которые в случае того или иного действия с сокетом меняются... | }</source>В данном случае классами состояния являются: CStateOpen, CStateRead и CStateClose. Которые в случае того или иного действия с сокетом меняются... | ||
<source lang="bash"> CStateClose | <source lang="bash"> CStateClose | ||
Строка 1006: | Строка 1001: | ||
== Цепочка обязанностей (Chain of Responsibility) == | == Цепочка обязанностей (Chain of Responsibility) == | ||
== Шаблонный метод (Template Method) == | == Шаблонный метод (Template Method) == | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
== Высокое зацепление (High Cohesion) == | == Высокое зацепление (High Cohesion) == | ||
== Контроллер (Controller) == | == Контроллер (Controller) == |