Delphi 7 - 试图理解MVC模式

时间:2011-07-29 12:59:21

标签: delphi model-view-controller

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

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

1 个答案:

答案 0 :(得分: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.

型号:

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;

控制器:

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;

主窗体作为视图使用,我已从中删除所有代码。

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

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;

我在View< - >中欺骗了一下。控制器关系,但你应该得到一般的想法:)。

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

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

MVC diagram