デザインモード-subject(行動)

脱離および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 ; 
}

おすすめ

転載: www.cnblogs.com/fourmi/p/12082586.html