Decorator Design Pattern trong C# – Cách triển khai và ví dụ

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]

decorator 01 png

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

decorator 02 png

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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *