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

Ngày đăng: 2023-05-04 13:04:11

Mục lục

1. 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.

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.

2.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ể.

ICar.cs

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.

BMWCar.cs

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.

CarDecorator.cs

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.

DieselCarDecorator.cs

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ơ đó.

PetrolCarDecorator.cs

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ô.

Main

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 thuanhoaonline.com");

            Console.ReadKey();

        }

    }

}

Kết quả:

 

 

Về bài trước...

                                  Bài tiếp theo...


Tài liệu lập trình C#

Bài viết trong cùng chuyên mục

Góc games giải trí



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Tower game

Plapy Bird (NH.Đông)

Vượt chướng ngại vật



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

12522