- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
[C#] Hướng dẫn thiết kế BaseForm sử dụng Template Method Pattern
Xin chào các bạn, bài viết hôm nay mình hướng dẫn các bạn cách thiết kế BaseForm sử dụng Template Method Pattern trong Design Pattern, và pattern này các bạn sẽ thấy thường xuyên được sử dụng phổ biến.
[C#] Design BaseForm using Template Method Patern
Template Method Pattern là gì?
Template Method Pattern là một trong các pattern thuộc nhóm behavioural pattern, nó định nghĩa ra một khung sườn hay một template, là các thao tác cần phải xử lí của một chức năng nào đó. Các thao tác này có thể được các class con kế thừa và xử lí lại mà không làm thay đổi, ảnh hưởng đến cấu trúc bên trong chức năng đó.
Áp dụng Template Method Pattern
Template Method Pattern được sử dụng khá nhiều trong mô hình Abstract class (cha) - Concrete Class (con) khi chúng ta muốn các Concrete class tự thực thi xử lí theo cách của nó, nhưng đồng thời vẫn đảm bảo tuận theo những ràng buộc nhất định từ Abstract class, ví dụ như ràng buộc về thứ tự các bước, hay ràng buộc về đầu vào, đầu ra...
Trong pattern này, Abstract class định nghĩa ra một template method để thực hiện một chức năng nào đó. Template method này sẽ gọi đến các method khác bên trong Abstract class để tạo dựng nên bộ khung. Nhưng có thể các method đó sẽ không được thực thi bên trong Abstract class, mà sẽ được override và thực thi lại bên trong các Concrete class.
Các bạn xem hình ảnh dưới đây:
BaseForm, mình sẽ thiết kế một khung sườn sẵn để cho các form sau thừa kế lại để sử dụng.
Nếu bạn nào viết web, thì BaseForm nó giống như Master Layout.
Các bạn xem hình demo của BaseForm C#:
Thay vì, đi form nào mình cũng thiết kế nút Save và Close, thì mình sẽ dựng sẵn như hình và truyền body vào phần nội dung thay đổi thôi
Hình ảnh Form ConcreteForm.cs
Khi các bạn thiết kế theo kiểu temple, ví dụ bạn muốn đổi chữ Save => Lưu nó sẽ áp dụng được cho tất cả các form đã thừa kế nó, mà chúng ta không cần phải đi chỉnh sửa lại nhiều nơi.
Source code C# BaseForm:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BaseFormDemo
{
public partial class BaseForm : Form
{
public enum Mode
{
View,
Add,
Edit,
}
public BaseForm()
{
InitializeComponent();
this.Load += BaseForm_Load;
}
private void BaseForm_Load(object sender, EventArgs e)
{
this.LoadForm();
}
public void LoadForm()
{
this.InitControl();
this.SetControl();
this.SetAuthority();
this.SetData();
}
public virtual void InitControl()
{
this.AcceptButton = this.btnSave;
this.CancelButton = this.btnClose;
this.btnSave.Click += BtnSave_Click;
this.btnClose.Click += BtnClose_Click;
}
protected virtual void BtnClose_Click(object sender, EventArgs e)
{
this.Close();
}
protected virtual void BtnSave_Click(object sender, EventArgs e)
{
MessageBox.Show("Gọi hàm ở BaseForm/...");
}
public virtual void SetControl() { }
public virtual void SetData() { }
public virtual void SetAuthority()
{
this.btnSave.Enabled = HasAuthority("Add");
this.btnClose.Enabled = HasAuthority("Close");
}
private bool HasAuthority(string authority)
{
return true;
}
}
public enum Mode
{
View,
Add,
Close,
}
}
Ở trên BaseForm nút nào bạn muốn truy cập nhớ chỉnh Modifier => Protected nhé.
Source code Form ConcreteForm.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BaseFormDemo
{
public partial class ConcreteForm : BaseForm
{
public ConcreteForm()
{
InitializeComponent();
}
public override void InitControl()
{
base.InitControl();
}
protected override void BtnSave_Click(object sender, EventArgs e)
{
var username = textBox1.Text;
MessageBox.Show(username);
base.BtnSave_Click(sender, e); // nó sẽ gọi chạy hàm ở baseForm, nếu chúng ta gọi hàm này
}
public override void SetAuthority()
{
this.btnSave.Enabled = false; // ghi đè lại
}
}
}
Bạn thấy ở form ConcreteForm mình thừa kế lại thừ BaseForm => bạn qua form design sẽ thấy template của BaseForm load vào.
Khi các bạn muốn viết sự kiện lại cho nút Button Save thì các bạn chỉ cần override lại hàm đó.
Bài viết, yêu cầu các bạn phải nắm về OPP nhé, không sẽ bị hoang mang.
P/s: Khi thiết kế template, chúng ta sẽ tiết kiệm được nhiều dòng code, và bảo trì đơn giản hơn.
Thanks for watching!