NEWS

[C#] Hướng dẫn thiết kế BaseForm sử dụng Template Method Pattern

[C#] Hướng dẫn thiết kế BaseForm sử dụng Template Method Pattern
Đăng bởi: Thảo Meo - Lượt xem: 2633 16:19:45, 22/09/2022C#   In bài viết

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:

base_form_csharp

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#:

base_form_desgin_csharp

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

ConcreteForm-csharp

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!

 

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Hướng dẫn thiết kế BaseForm sử dụng Template Method Pattern
Đăng bởi: Thảo Meo - Lượt xem: 2633 16:19:45, 22/09/2022C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.