《GOF设计模式》—中介者 (MEDIATOR)—Delphi源码示例:中介者接口

    技术2022-05-20  60

    示例:中介者接口 说明: (1)、定义 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 (2)、结构 中介者 Mediator(中介者):中介者定义一个接口用于与各同事(Colleague)对象通信。 ConcreteMediator(具体中介者):具体中介者通过协调各同事对象实现协作行为。了解并维护它的各个同事。 同事 Colleagueclass(同事类):每一个同事类都知道它的中介者对象。每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。 代码: unit uMediator; interface uses     SysUtils, Dialogs; type     TMediator = class;     TColleague = class     private         FMediator: TMediator;     public         constructor Create(AMediator: TMediator);         //---         procedure Notify();     end;     TConcreteColleague1 = class(TColleague)     private         FValue: Integer;         procedure SetValue(const Value: Integer);     public         property Value: Integer read FValue write SetValue;     end;     TConcreteColleague2 = class(TColleague)     private         FValue: Integer;         procedure SetValue(const Value: Integer);     public         property Value: Integer read FValue write SetValue;     end;     TMediator = class     public         procedure Changed(AColleague: TColleague); virtual; abstract;     end;     TConcreteMediator = class(TMediator)     private         FColleague1: TConcreteColleague1;         FColleague2: TConcreteColleague1;     public         constructor Create;         destructor Destroy; override;         //---         procedure Changed(AColleague: TColleague); override;         procedure Calc;     end; procedure Test; implementation procedure Test; var     AMediator: TConcreteMediator; begin     AMediator := TConcreteMediator.Create;     AMediator.Calc;     AMediator.Free; end; constructor TColleague.Create(AMediator: TMediator); begin     FMediator := AMediator; end; procedure TColleague.Notify; begin     FMediator.Changed(self); end; procedure TConcreteColleague1.SetValue(const Value: Integer); begin     FValue := Value;     //---     self.Notify; end; procedure TConcreteColleague2.SetValue(const Value: Integer); begin     FValue := Value;     //---     self.Notify; end; procedure TConcreteMediator.Calc; begin     FColleague1.Value := 1; end; procedure TConcreteMediator.Changed(AColleague: TColleague); begin     if AColleague = FColleague1 then         FColleague2.Value := FColleague1.Value + 2     else if AColleague = FColleague2 then         ShowMessage(IntToStr(FColleague2.Value)); end; constructor TConcreteMediator.Create; begin     inherited;     //---     FColleague1 := TConcreteColleague1.Create(self);     FColleague2 := TConcreteColleague1.Create(self); end; destructor TConcreteMediator.Destroy;     //---     procedure _Free(AColleague: TColleague);     begin         if AColleague <> nil then             AColleague.Free;     end; begin     _Free(FColleague1);     _Free(FColleague2);     //---     inherited; end; end.


    最新回复(0)