Редактирование: 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);
+
m_pModel->attach(this);
     }
     }
-
 
-
    virtual ~CObserver()
 
-
    {
 
-
        m_pModel.detach(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 << "Already open socket" << std::endl; }
+
    virtual void open(CSocket *s) { std::cout << "Open socket" << std::endl; }
-
virtual void read(CSocket *s) { std::cout << "Already read socket" << std::endl; }
+
virtual void read(CSocket *s) { std::cout << "Read socket" << std::endl; }
-
virtual void close(CSocket *s) { std::cout << "Already close 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 setCurrent(CState *p){ m_pCurrentState = p; }
-
void open() { m_pCurrentState->open(this); }  
+
    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);
+
    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);
+
    virtual void close(CSocket *s);
};
};
Строка 972: Строка 967:
int main()
int main()
{
{
-
void(CSocket::*ptrs[])() = { &CSocket::open, &CSocket::read, &CSocket::close };
+
  void(CSocket::*ptrs[])() = { &CSocket::open, &CSocket::read, &CSocket::close };
-
CSocket sock;
+
  CSocket sock;
-
int num;
+
  int num;
-
while( 1 )
+
  while( 1 )
-
{
+
  {
-
std::cout << "Enter 0/2: ";
+
    std::cout << "Enter 0/2: ";
-
std::cin >> num;
+
    std::cin >> num;
-
(sock.*ptrs[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) ==
-
<source lang="cpp">#include <iostream>
 
-
 
-
class CApp
 
-
{
 
-
public:
 
-
void openDocument()
 
-
{
 
-
//...
 
-
doOpenDocument();
 
-
//...
 
-
}
 
-
 
-
protected:
 
-
virtual void doOpenDocument() { std::cout << "Open simple document" << std::endl; }
 
-
};
 
-
 
-
class CXmlApp: public CApp
 
-
{
 
-
protected:
 
-
void doOpenDocument() { std::cout << "Open XML document" << std::endl; }
 
-
};
 
-
 
-
class CTxtApp: public CApp
 
-
{
 
-
protected:
 
-
void doOpenDocument() { std::cout << "Open TXT document" << std::endl; }
 
-
};
 
-
 
-
int main()
 
-
{
 
-
CApp *pApps[] = { &CApp(), &CXmlApp(), &CTxtApp() };
 
-
for( int n = 0; n < 3; ++n )
 
-
pApps[n]->openDocument();
 
-
return 0;
 
-
}</source>В данном примере метод doOpenDocument является шаблонным методом.
 
-
Вывод:
 
-
<source lang="bash">Open simple document
 
-
Open XML document
 
-
Open TXT document</source>
 
-
 
== Высокое зацепление (High Cohesion) ==
== Высокое зацепление (High Cohesion) ==
== Контроллер (Controller) ==
== Контроллер (Controller) ==

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Wiki.crossplatform.ru:Авторское право). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!