Delphi 7 - an attempt to understand the MVC pattern

I am trying to understand the MVC pattern, and this is what I came up with. If you were kind and told me if I would do it right, suggest some improvements or be disappointed in the fact that I completely could not, I would be more than happy!

Here is a link to the project (Delphi 7): http://www.sendspace.com/file/ynpgre

+6
source share
1 answer

I rewrote your project to use MVC.

The main project file:

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. 

Model:

 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; 

Controller:

 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; 

The main form works as a view, I deleted everything from it.

The controller is registered as an observer and performs all the logic:

 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; 

I changed the View โ†” Controller attitude a bit, but you should get a general idea :).

  • The controller has links to View and Model.
  • The View knows nothing about the model.
  • The model does not know anything from the view.

PS: diagram for MVC pattern (dashed lines represent Observer / Subject relationships):

MVC diagram

+19
source

Source: https://habr.com/ru/post/893863/


All Articles