Observer Pattern

From YYpBD's MediaWiki

Jump to: navigation, search

목차

개요

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 );
맞춤검색