pureMVC學習之一

雲水浮萍發表於2015-01-17

//1
var
  MainWindow: TMainWindow;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TMainWindow, MainWindow);
  ApplicationFacade.Startup(MainWindow);            
  Application.Run;
end.

//2
function ApplicationFacade: IApplicationFacade;
begin
  Result := (TApplicationFacade.Instance as IApplicationFacade)
end;

//3
procedure TFacade.InitializeFacade;
begin
  InitializeModel;
  InitializeController;
  InitializeView;
end;

//4 TApplicationFacade 呼叫父類的註冊命令方法
procedure TApplicationFacade.InitializeController();
begin
  /// call inherited to use the PureMVC Controller Singleton.
  inherited;
  /// Otherwise, if you're implmenting your own
  /// IController, then instead do:
  /// if Assigned(FController) then Exit;
  /// FController = MyAppController.getInstance;

  /// do any special subclass initialization here
  /// such as registering Commands
  RegisterCommand(MSG.Startup, TStartupCommand);
  RegisterCommand(MSG.DELETE_USER, TDeleteUserCommand);
  RegisterCommand(MSG.ADD_ROLE_RESULT, TAddRoleResultCommand);
end;

//5 TFacade 呼叫控制器註冊命令方法
procedure TFacade.RegisterCommand(NotificationName: string;
    CommandClass: TClass);
begin
  FController.RegisterCommand(NotificationName, CommandClass);
end;


procedure TController.RegisterCommand(NotificationName: string; CommandType: TClass);
begin
  Assert(CommandType.InheritsFrom(TCommand));//是否繼承自TCommand
  TMonitor.Enter(FSyncRoot);
  try
    if FCommandMap.ContainsKey(NotificationName) then Exit;//註冊過的命令則放棄

    // This call needs to be monitored carefully. Have to make sure that RegisterObserver
    // doesn't call back into the controller, or a dead lock could happen.

    FView.RegisterObserver(NotificationName, TObserver.Create('ExecuteCommand', Self));//檢視註冊觀察者,收到此訊息時即可呼叫訊息對應的命類的執行方法
    FCommandMap.Add(NotificationName, TCommandClass(CommandType));//控制器命令列表中增加新命令

  finally
    TMonitor.Exit(FSyncRoot);
  end;
end;

相關文章