[21430]Observerモード


設計モードでの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)を追加すると自動的に実行されます