我正在尝试理解MVC模式,这就是我想出的。如果你可以如此善良并告诉我,如果我做得正确,建议一些改进,或者让我完全失败,我会非常高兴!
这是项目的链接(Delphi 7):http://www.sendspace.com/file/ynpgre
答案 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< - >中欺骗了一下。控制器关系,但你应该得到一般的想法:)。
PS:MVC模式的图表(虚线表示观察者/主题关系):