Trong bài viết này mình sẽ giới thiệu đến các bạn Decorator Design Pattern trong C# – Cách triển khai và ví dụ. Đây là một loại pattern thuộc nhóm Structural Design Pattern trong C#.
Chúng ta sẽ cùng nhau tìm hiểu về Decorator Design Pattern là gì? Cách triển khai nó trong C# và một vài ví dụ cụ thể về nó.
Decorator Design Pattern trong C# là gì?
Decorator Design Pattern trong C# cho phép chúng ta thêm động các chức năng mới vào một đối tượng hiện có. Điều này không làm thay đổi hay sửa đổi cấu trúc của nó.
Pattern này hoạt động như một lớp bao bọc cho lớp hiện có. Nó tự động thay đổi chức năng của đối tượng trong thời gian chạy mà không ảnh hướng đến chức năng hiện có của đối tượng.
Bài viết này được đăng tại [kiso.vn]
Ví dụ: Giả sử mình có một chiếc xe ô tô không có động cơ. Bây giờ mình muốn thêm một động cơ xăng hoặc động cơ Diesel vào chiếc ô tô này. Vậy khi thêm vào thì những thành phần trước đó và chức năng của nó không bị thay đổi. Chỉ có thêm động cơ mà thôi.
Cách triển khai và ví dụ về Decorator Desgin Pattern trong C#
Trong phần này mình sẽ thực hiện triển khai Decorator Design Pattern bằng ví dụ chiếc ô tô ở trên. Quá trình triễn khai được thực hiện theo từng bước sau đây.
Bước 1: Tạo ICar interface.
Interface này có một abstract method, phương thức này được thực hiện các subclasses cụ thể.
using System; using System.Collections.Generic; using System.Text; namespace DecoratorDesignPattern { public interface ICar { ICar ManufactureCar(); } }
Bước 2: Tạo Concrete Car.
Tạo một class BMWCar có có chức năng triển khai interface ICar, trong đó có một phương thức ManufactureCar()
. Phương thức này chịu trách nhiệm sản xuất CarBody, CarDoor, CarWheels, CarGlass.
Vì vậy khi chúng ta gọi phương thức này, kết quả trả về không có động cơ nào cả, chỉ có các phần cứng bên ngoài này mà thôi.
using System; using System.Collections.Generic; using System.Text; namespace DecoratorDesignPattern { public class BMWCar : ICar { private string CarName = "BMW"; public string CarBody { get; set; } public string CarDoor { get; set; } public string CarWheels { get; set; } public string CarGlass { get; set; } public string Engine { get; set; } public override string ToString() { return "BMWCar [CarName=" + CarName + ", CarBody=" + CarBody + ", CarDoor=" + CarDoor + ", CarWheels=" + CarWheels + ", CarGlass=" + CarGlass + ", Engine=" + Engine + "]"; } public ICar ManufactureCar() { CarBody = "carbon fiber material"; CarDoor = "4 car doors"; CarWheels = "6 car glasses"; CarGlass = "4 MRF wheels"; return this; } } }
Bước 3: Tạo Car Decorator.
using System; using System.Collections.Generic; using System.Text; namespace DecoratorDesignPattern { public abstract class CarDecorator : ICar { protected ICar car; public CarDecorator(ICar car) { this.car = car; } public virtual ICar ManufactureCar() { return car.ManufactureCar(); } } }
Bước 4: Tạo Diesel Car Decorator.
Đây là một class được kế thừa từ abstract class CarDecorator. Class này ghi đè phương thức ManufactureCar()
. Những gì phương thức này làm là thêm một động cơ Diesel vào xe và trả lại chiếc xe BMW có động cơ Diesel.
using System; using System.Collections.Generic; using System.Text; namespace DecoratorDesignPattern { public class DieselCarDecorator : CarDecorator { public DieselCarDecorator(ICar car) : base(car) { } public override ICar ManufactureCar() { car.ManufactureCar(); AddEngine(car); return car; } public void AddEngine(ICar car) { if (car is BMWCar) { BMWCar BMWCar = (BMWCar)car; BMWCar.Engine = "Diesel Engine"; Console.WriteLine("DieselCarDecorator added Diesel Engine to the Car : " + car); } } } }
Bước 5: Tạo Petrol Car Decorator.
Tương tự như bước 4, sau khi thêm động cơ xăng vào sẽ trả lại chiếc BMW với động cơ đó.
using System; using System.Collections.Generic; using System.Text; namespace DecoratorDesignPattern { class PetrolCarDecorator : CarDecorator { public PetrolCarDecorator(ICar car) : base(car) { } public override ICar ManufactureCar() { car.ManufactureCar(); AddEngine(car); return car; } public void AddEngine(ICar car) { if (car is BMWCar) { BMWCar BMWCar = (BMWCar)car; BMWCar.Engine = "Petrol Engine"; Console.WriteLine("PetrolCarDecorator added Petrol Engine to the Car : " + car); } } } }
Bước 6: Tạo Client.
Đầu tiên ta tạo đối tượng BMWCar sau đó gọi phương thức ManufatureCar sẽ tạo ra một chiếc xe không có động cơ.
Tiếp đến tạo instance của DieselCarDecorator và truyền instance BMWCar làm tham số. Khi chúng ta gọi hàm ManufatureCar()
thì nó sẽ thêm động cơ Diesel vào ô tô.
using System; namespace DecoratorDesignPattern { class Program { static void Main(string[] args) { ICar bmwCar1 = new BMWCar(); bmwCar1.ManufactureCar(); Console.WriteLine(bmwCar1 + "n"); DieselCarDecorator carWithDieselEngine = new DieselCarDecorator(bmwCar1); carWithDieselEngine.ManufactureCar(); Console.WriteLine(); ICar bmwCar2 = new BMWCar(); PetrolCarDecorator carWithPetrolEngine = new PetrolCarDecorator(bmwCar2); carWithPetrolEngine.ManufactureCar(); Console.Write("n-------------------------n"); Console.WriteLine("Chuong trinh nay duoc dang tai Kiso.vn"); Console.ReadKey(); } } }
Kết quả:
Như vậy là chúng ta đã cùng nhau tìm hiểu về Decorator Design Pattern trong C# – Cách triển khai và ví dụ của nó. Bài tiếp theo mình sẽ giới thiệu đến các bạn Bridge Design Pattern trong C#.
vào
Bài viết liên quan
[CSF-2] Một số thiết lập CSF, LFD
Hôm nay mình sẽ thực hiện một số thiết lập trên CSF Mở file config để sửa đổi một số tính năng dưới /etc/csf/csf.conf Nội dung chínhDecorator Design Pattern trong C# là gì?Cách triển khai...
[CSF-1] Tăng bảo mật Server với ConfigServer Firewall (CSF)
Nội dung chínhDecorator Design Pattern trong C# là gì?Cách triển khai và ví dụ về Decorator Desgin Pattern trong C#1. Khái niệm CSF: CSF (ConfigServer & Firewall) là một bộ ứng dụng hoạt động trên...
Sử dụng SSH Key với Gitlab và Github
Bài viết này mình sẽ hướng dẫn các bạn tạo ssh key cho Gitlab và Github SSH là gì? Secure Socket Shell là một giao thức mạng dùng để thiết lập kết nối mạng một...
Directory traversal vulnerabilities (phần 4)
Nội dung chínhDecorator Design Pattern trong C# là gì?Cách triển khai và ví dụ về Decorator Desgin Pattern trong C#V. Phân tích và khai thác các lỗ hổng Directory traversal (tiếp) 5. Bypass lỗ hổng...
Directory traversal vulnerabilities (phần 3)
Nội dung chínhDecorator Design Pattern trong C# là gì?Cách triển khai và ví dụ về Decorator Desgin Pattern trong C#V. Phân tích và khai thác các lỗ hổng Directory traversal 1. Lỗ hổng xảy ra...
Directory traversal vulnerabilities (phần 2)
Nội dung chínhDecorator Design Pattern trong C# là gì?Cách triển khai và ví dụ về Decorator Desgin Pattern trong C#III. Vì sao lỗ hổng Directory traversal xuất hiện? Với mỗi ngôn ngữ lập trình khác...