[210430] Observer 패턴

디자인패턴 중 Observer 패턴

역할
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가 자동 실행 됨

좋은 웹페이지 즐겨찾기