mercredi 22 juin 2016

How replace multi event with observer (Spring4D)

I have class with 2 events: OnConnect and OnDisconnect:

type
    TEvent = reference to procedure;
    TConnection = class
    private
        fOnConnect: TEvent;
        fOnDisconnect: TEvent;
    public
        procedure SomeBehavior(aChoice: Boolean);
        property OnConnect: TEvent read fOnConnect write fOnConnect;
        property OnDisconnect: TEvent read fOnDisconnect write fOnDisconnect;
    end;

implementation

{ TConnection }

procedure TConnection.SomeBehavior(aChoice: Boolean);
begin
    if aChoice then
        fOnConnect
    else
        fOnDisconnect;
    //im not cheacking Assign(Events) to make example simple
end;

now I would like to do same thing but in more object style. I mean use interfaces and observer pattern from String4D. And i made this:

interface

uses
    Spring.DesignPatterns;

type
    IObserver = interface
        procedure ReactToConnect(aText: String);
        procedure ReactToDisconnect(aTimeoutInMs: Integer);
    end;

    IConnection<T> = interface(IObservable<IObserver>)
        procedure SomeBehavior(aChoice: Boolean);
    end;

implementation

uses
    System.SysUtils;

type
    TConnection = class(TObservable<IObserver>, IConnection<IObserver>)
    public
        procedure SomeBehavior(aChoice: Boolean);
    end;

{ TConnection }

procedure TConnection.SomeBehavior(aChoice: Boolean);
var
    procOnConnect: TProc<IObserver>;
    procOnDisconnect: TProc<IObserver>; // what if i want no parameters?
    someText: String;
    someNumber: Integer;
begin
    someText := RandomText;
    procOnConnect := procedure(aObserver: IObserver)
                      begin
                          aObserver.ReactToConnect(someText);
                      end;
    someNumber := RandomInt;
    procOnDisconnect := procedure(aObserver: IObserver)
                         begin
                            aObserver.ReactToDisconnect(someNumber);
                         end;

    if aChoice then
        Self.NotifyListeners(procOnConnect)
    else
        Self.NotifyListeners(procOnDisconnect);

end;

im doing it fisrt time and just want to ask if its proper way? or im doing somethink heretical here?

Aucun commentaire:

Enregistrer un commentaire