脱離およびC ++のソースコードを達成するための23個のデザインパターン-GoFファインパターンの設計ソリューション:以下のソースコード
//Subject.h
#pragma一度 の#include <リスト> の#include < 文字列 > のtypedefのstd :: 文字列の状態。 クラスオブザーバー; クラス件名 { パブリック: 仮想〜件名(); 仮想 ボイドはアタッチ(オブザーバーを* OBV)。 仮想 空デタッチ(オブザーバー* OBV)。 仮想 無効)(通知。 仮想 のボイド(SetState関数のconst州立&ST)= 0 ; 仮想国家GETSTATE()=0 ; 保護された: 件名(); プライベート: STD ::リスト <オブザーバー*> * _obs。 }。 クラス ConcreateSubject:公共件名 { パブリック: ConcreateSubject(); 〜ConcreateSubject(); 空 SetState関数(のconst州立&ST); 状態GETSTATE(); 保護: プライベート: 国家_st。 }。
//Subject.cpp
#include " Subject.h " の#include " Observer.h " の#include <iostreamの> の#include <リスト> のtypedefのstd :: 文字列の状態。 被験者::被写体() { _obs = 新規のstd ::リスト<オブザーバー*> 。 } テーマ::〜件名() {} ボイド件名::取り付け(観察* OBS) { _obs - > push_front(OBS)。 } 無効件名::デタッチ(オブザーバー* OBS) { 場合(OBS!= NULL) _obs - > 削除(OBS)。 } 無効件名::()通知 { のため(のstd ::リスト<オブザーバー*> ::イテレータそれ= _obs->開始();それ= _obs->エンド();!++ 、それは) { ( *それ) - >アップデート(この); } } ConcreateSubject :: ConcreateSubject() { _st = " \ 0 " 。 } ConcreateSubject ::〜ConcreateSubject() { } 状態ConcreateSubject :: GETSTATE() { 戻り_st。 } 無効 ConcreateSubject :: SetState関数(CONST状態&ST) { _st = ST。 }
//Observer.h
#include " Subject.h " の#include < 文字列 > のtypedefのstd :: 文字列の状態。 クラスオブザーバー { パブリック: 仮想〜オブザーバー(); 仮想 空を更新(件名*サブ)= 0 ; 仮想 空 PRINTINFO()= 0 ; 保護: オブザーバー(); 州_st。 プライベート: }; クラス ConcreateObserverA:公共オブザーバー { パブリック: 仮想件名* GetSubject(); ConcreateObserverA(件名 * サブ)。 仮想〜ConcreateObserverA(); 空アップデート(件名* サブ)。 空PRINTINFO(); 保護: プライベート: 件名 * _sub。 }。 クラス ConcreateObserverB:公共オブザーバー { パブリック: 仮想件名* GetSubject(); ConcreateObserverB(件名 * サブ)。 仮想〜ConcreateObserverB(); 空アップデート(件名* サブ)。 空PRINTINFO(); 保護: プライベート: 件名 * _sub。 }。
//Observer.cpp
#include " Observer.h " の#include " Subject.h " の#include <iostreamの> する#include < ストリング > オブザーバー::オブザーバー(){ _st = ' \ 0 ' 。 } オブザーバー::〜オブザーバー(){} ConcreateObserverA :: ConcreateObserverA(件名 * サブ) { _sub = 副。 _sub - >アタッチ(本) } ConcreateObserverA ::〜ConcreateObserverA() { _sub - >デタッチ(この); もし(!_sub = 0 ) 、削除_sub。 } 件名 * ConcreateObserverA :: GetSubject() { 戻り_sub。 } ボイドConcreateObserverA :: PRINTINFO() { のstd :: COUT << " ConcreateObserverA ... " << _sub-> GETSTATE()<< はstd :: ENDL。 } ボイド ConcreateObserverA ::更新(件名* サブ) { _st =サブ> GETSTATE(); PRINTINFO(); } ConcreateObserverB :: ConcreateObserverB(件名 *サブ) { _sub = 副。 _sub - >アタッチ(本) } ConcreateObserverB ::〜ConcreateObserverB() { _sub - >デタッチ(本) もし(!_sub = 0 ) 、削除_sub。 } 件名 * ConcreateObserverB :: GetSubject() { 戻り_sub。 } ボイドConcreateObserverB :: PRINTINFO() { のstd :: COUT << " ConcreateObserverB ... " << _sub-> GETSTATE()<<std ::てendl; } ボイド ConcreateObserverB ::更新(件名* サブ) { _st =サブ> GETSTATE(); PRINTINFO(); }
//main.cpp
#include " Observer.h " の#include " Subject.h " の#include <iostreamの> する#include < ストリング > int型のmain(int型の引数、文字 * ARGV) { ConcreateSubject *副= 新しいConcreateSubject()。 オブザーバー * 01 = 新しいConcreateObserverA(サブ)。 オブザーバー * O2 = 新しいConcreateObserverB(サブ)。 サブ - > SetState関数(" 古いです" ); サブ - > 通知(); サブ- > SetState関数(" 新しいです" ); サブ - > 通知(); getchar(); リターン 0 ; }