Delphi 7 - 试图理解MVC模式

Pat*_*man 6 delphi model-view-controller

我试图理解MVC模式,这就是我想出的.如果你可以如此善良并告诉我,如果我做得正确,建议一些改进,或者让我完全失败,我会非常高兴!

这是该项目的链接(Delphi 7):http://www.sendspace.com/file/ynpgre

Jen*_*off 19

我已经重写了你的项目以使用MVC.

主项目文件:

var
  Model: TModel;
  Controller: TController;
begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);

  Model      := TModel.Create;
  Controller := TController.Create(Model, MainForm);

  Application.Run;

  Controller.Free;
  Model.Free;
end.
Run Code Online (Sandbox Code Playgroud)

模型:

TModel = class(TSubject)
private
  FData: TStrings;
public
  constructor Create;
  destructor Destroy(); override;
  procedure AddLine(AText: string);
  property Data: TStrings read FData; // Do not write to this directly, since it doesn't call notify!
end;
Run Code Online (Sandbox Code Playgroud)

控制器:

TController = class(TObserver)
private
  FModel: TModel;
  FView:  TMainForm;
public
  constructor Create(const AModel: TModel; AView: TMainForm);
  destructor Destroy(); override;
  procedure ButtonClick(Sender: TObject);
  procedure Refresh(ASubject: TSubject); override;
end;
Run Code Online (Sandbox Code Playgroud)

主窗体作为View工作,我已经从中删除了所有代码.

控制器将自己注册为观察者并执行所有逻辑:

constructor TController.Create(const AModel: TModel; AView: TMainForm);
begin
  inherited Create();
  FModel := AModel;
  FView  := AView;
  FModel.Register(Self);
  FView.Button1.OnClick := ButtonClick;
  FView.Button2.OnClick := ButtonClick;
  FView.Button3.OnClick := ButtonClick;
end;

destructor TController.Destroy;
begin
  FModel.UnRegister(Self);
  FView.Button1.OnClick := nil;
  FView.Button2.OnClick := nil;
  FView.Button3.OnClick := nil;
  inherited;
end;

procedure TController.Refresh(ASubject: TSubject);
begin
  FView.ListBox1.Items.BeginUpdate;
  try
    FView.ListBox1.Items.Assign(FModel.Data);
  finally
    FView.ListBox1.Items.EndUpdate;
  end;
end;

procedure TController.ButtonClick(Sender: TObject);
begin
  if Sender = FView.Button1 then begin
    FModel.AddLine('Hello');
  end else
  if Sender = FView.Button2 then begin
    FModel.AddLine('Hello World!');
  end else
  if Sender = FView.Button3 then begin
    FModel.AddLine(DateToStr(Now));
  end
end;
Run Code Online (Sandbox Code Playgroud)

我对View < - > Controller关系有点欺骗,但你应该得到一般的想法:).

  • Controller引用了View和Model.
  • View对模型一无所知.
  • 模型对视图一无所知.

PS:MVC模式的图表(虚线表示观察者/主题关系):

MVC图

  • 不完全是,它们是某些库代码的一部分.基本上`TSubject`有一个'TObserver`列表,可以通过`Register`方法添加.当在`TSubject`上调用`Notify`方法时,它会在所有观察者上调用`Refresh(Self)`. (4认同)