역할
1) 어떤 상황이 발생하는지 잘 관찰하는 것
2) 특정상황이 발생하면 그 사실을 꼭 알아야하는 다른 대상들에게 전파해 주는 것
이런 개념이 개발에도 꼭 필요한 경우가 있다.
Ex; 채팅 프로그램
-> 채팅방에 10명의 대화자가 참가중인데 이중에 누구든 글을 쓰면 다른 대회자들도 그 내용을 볼 수 있어야 하기 때문
Observe 패턴의 TObserve 클래스의 핵심 기능
1) TObserve 클래스는 전파대상들을 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
->IndexOf(const Value: T): Integer - 목록에서 Value 인덱스 반환(없으면 -1)
2)OnClick 이벤트를 코드 내에서 강제 발생시키기
->버튼Name.OnClick(self), 콤보박스.OnChange(self) 이렇게 넣으면 해당 procedure가 자동 실행 됨