Observer Pattern
From YYpBD's MediaWiki
목차 |
[편집]
개요
Observer 패턴은 정보 제공자인 Subject와 정보 수신자인 Observer로 구성된다.
신문의 예를 들자면 신문을 찍어내는 신문사는 Subject, 신문을 구독하는 독자는 Observer가 된다.
[편집]
예제
[편집]
Delphi
[편집]
Subject
type
ISubject = interface
procedure registerObserver(AObserver: IObserver );
procedure removeObserver( AObserver: IObserver );
procedure notifyObservers();
end;
TNews = class( TInterfacedObject, ISubject )
private
FList: TList;
FData: Integer;
public
constructor Create;
destructor Destroy; override;
procedure registerObserver(AObserver: IObserver);
procedure removeObserver(AObserver: IObserver);
procedure notifyObservers();
procedure SetData( AData: Integer );
end;
implementation
{ TNews }
constructor TNews.Create;
begin
FList := TList.Create;
end;
destructor TNews.Destroy;
begin
FList.Free;
end;
procedure TNews.notifyObservers;
var
I: Integer;
Observer: IObserver;
begin
for I := 0 to FList.Count - 1 do
begin
Observer := IObserver(FList.Items[I]);
Observer.Update( FData );
end;
end;
procedure TNews.registerObserver(AObserver: IObserver);
begin
if FList.IndexOf( Pointer(AObserver) ) = -1 then
FList.Add( Pointer(AObserver) );
end;
procedure TNews.removeObserver(AObserver: IObserver);
var
I: Integer;
begin
for I := 0 to FList.Count - 1 do
begin
if FList.Items[I] = Pointer(AObserver) then
begin
FList.Delete(I);
Break;
end;
end;
end;
procedure TNews.SetData(AData: Integer);
begin
FData := AData;
notifyObservers;
end;
[편집]
Observer
type
IObserver = class
procedure Update( AData: Integer ); virtual; abstract;
end;
TReaderDisplay = class( IObserver )
public
procedure Update( AData: Integer ); override;
end;
implementation
{ TReaderDisplay }
procedure TReaderDisplay.Update(AData: Integer);
begin
// AData를 이용..
end;
[편집]
이용
var FNews: TNews; FReaderDisplay: TReaderDisplay; begin FNews := TNews.Create; FReaderDisplay := TReaderDisplay.Create; FNews.registerObserver( FReaderDisplay ); FNews.SetData( 20 ); FNews.removeObserver( FReaderDisplay ); FNews.Free; FReaderDisplay.Free;
[편집]
Java
[편집]
Subject
public interface ISubject {
public abstract void registerObserver(IObserver AObserver);
public abstract void removeObserver(IObserver AObserver);
public abstract void notifyObservers();
}
import java.util.ArrayList;
public class TNews implements ISubject {
private ArrayList FObserverList;
private int FData;
public TNews (){
FObserverList = new ArrayList();
}
public void SetData(int AData) {
this.FData = AData;
OnDataChanged();
}
public void OnDataChanged() {
notifyObservers();
}
public void registerObserver(IObserver AObserver) {
if( this.FObserverList.indexOf( AObserver ) < 0 )
this.FObserverList.add( AObserver );
}
public void removeObserver(IObserver AObserver) {
int Index = this.FObserverList.indexOf( AObserver );
if( Index >= 0 )
this.FObserverList.remove( Index );
}
public void notifyObservers() {
for( int i = 0; i < this.FObserverList.size(); i++ )
{
IObserver observer = (IObserver)this.FObserverList.get( i );
observer.Update( FTemp, FHumidity, FPressure );
}
}
}
[편집]
Observer
public interface IDisplayElement {
}
public interface IObserver {
public abstract void Update( int AData );
}
public class TReaderDisplay implements IDisplayElement, IObserver {
public void Update( int AData ) {
// AData 이용
}
}
[편집]
이용
TNews News = new TNews();
ReaderDisplay = new TReaderDisplay();
News.registerObserver( ReaderDisplay );
News.SetData( 10 );
