[21430]Observerモード
2892 ワード
設計モードでのObserverモード
ロール#ロール#
1)何が起こったか観察する
2)特定の状況が発生した場合、それを他の知るべき対象に伝播する
この概念は開発にも必要である.
Ex; チャットプログラム
->チャットルームには10人の会話者が参加しており、その中で誰もが文章を書くだけで、他の参加者は内容を見ることができるはずです.
ObserverモードにおけるTobserverクラスのキー機能
1)Tobserverクラスは伝播先をTListに保存する
2)いずれの場合もTListに保存されている伝播先の特定イベントがトリガーされる
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TObsv = class(TObject)
private
FBtns : TList; //전파 대상자들을 TList에 보관
protected
procedure SpreadEventToBtns; //전파 대상자들의 특정 이벤트 발생시킴
public
constructor Create;
destructor Destroy; override;
procedure RegBtn( aBtn : TButton); //전파 대상자 추가
procedure UnRegBtn( aBtn : TButton); //전파 대상자 삭제
end;
TForm1 = class(TForm)
btnObsv: TButton;
btn1: TButton;
btn2: TButton;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
btn3: TButton;
edtText: TEdit;
Label1: TLabel;
procedure FormDestroy(Sender: TObject);
procedure btnObsvClick(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var
sObsv : TObsv;
// sObsv := instance of TObsv
{$R *.dfm}
{ TObsv }
constructor TObsv.Create;
begin
FBtns := TList.Create;
end;
destructor TObsv.Destroy;
begin
FBtns.Free;
inherited;
end;
procedure TObsv.RegBtn( aBtn : TButton );
begin
if FBtns.IndexOf(aBtn) = -1 then FBtns.Add( aBtn );
end;
procedure TObsv.UnRegBtn( aBtn : TButton );
begin
FBtns.Remove(aBtn);
end;
//이벤트 전파 [이 메서드가 Observer 패턴의 핵심]
procedure TObsv.SpreadEventToBtns;
var
i: Integer;
aBtn: TButton;
begin
for i := 0 to FBtns.Count - 1 do begin
aBtn := FBtns[i];
aBtn.OnClick(self);
end;
end;
{Form}
procedure TForm1.FormCreate(Sender: TObject);
begin
sObsv := TObsv.Create;
sObsv.RegBtn( btn1 );
sObsv.RegBtn( btn2 );
sObsv.RegBtn( btn3 );
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
sObsv.Free;
end;
procedure TForm1.btnObsvClick(Sender: TObject);
begin
sObsv.SpreadEventToBtns;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
btn1.Caption := edtText.Text + '의 필통'';
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
btn2.Caption := edtText.Text + '의 연필';
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
btn3.Caption := edtText.Text + '의 지우개';
end;
end.
*構文1)Indexof
->Const Value:T:IntegerリストからValueインデックスを返します(-1がない場合)
2)コードにおけるOnClickイベントの強制
->ボタンName.OnClick(self)、コンボボックス.OnChange(self)を追加すると自動的に実行されます
Reference
この問題について([21430]Observerモード), 我々は、より多くの情報をここで見つけました https://velog.io/@iseeu95/ookn88a5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol