close up photo of programming of codes

codecungnhau.com

Một trang web về kỹ thuật lập trình

C# Design Pattern: Decorator (Wrapper)

Decorator là một mẫu cấu trúc cho phép thêm động các hành vi mới vào các đối tượng bằng cách đặt chúng bên trong các đối tượng bọc đặc biệt.

Sử dụng decorator, có thể bọc các đối tượng vô số lần vì cả đối tượng đích và decorator đều tuân theo cùng một giao diện. Kết quả đối tượng sẽ nhận được một hành vi xếp chồng của tất cả các wrapper.

Cách sử dụng mẫu

Sử dụng: Decorator khá chuẩn trong mã C#, đặc biệt là trong mã liên quan đến luồng.

Nhận dạng: Decorator có thể được nhận dạng bởi các hàm tạo hoặc phương thức khởi tạo chấp nhận các đối tượng của cùng một lớp hoặc giao diện như lớp hiện tại.

Chương trình mẫu

Program.cs

using System;
namespace DesignPatterns.Composite.Conceptual
{
    // Giao diện Component cơ sở xác định các hoạt động có thể được thay đổi bởi
    // decorator.
    public abstract class Component
    {
        public abstract string Operation();
    }
    // Concrete Component cung cấp các triển khai mặc định của các hoạt động. 
    // Có thể có một số biến thể của các lớp này.
    class ConcreteComponent : Component
    {
        public override string Operation()
        {
            return "ConcreteComponent";
        }
    }
    // Lớp Decorator cơ sở tuân theo giao diện tương tự như các thành phần khác. 
    // Mục đích chính của lớp này là xác định giao diện bao bọc cho tất cả các Concrete 
    // Component. Việc triển khai mặc định của mã wrap có thể bao gồm một trường 
    // để lưu trữ một component được bọc và phương tiện để khởi tạo nó.
    abstract class Decorator : Component
    {
        protected Component _component;
        public Decorator(Component component)
        {
            this._component = component;
        }
        public void SetComponent(Component component)
        {
            this._component = component;
        }
        // Decorator ủy quyền cho tất cả các component được bao bọc.
        public override string Operation()
        {
            if (this._component != null)
            {
                return this._component.Operation();
            }
            else
            {
                return string.Empty;
            }
        }
    }
    // Concrete Decorator gọi đối tượng được bọc và thay đổi kết quả của nó 
    // theo một cách nào đó.
    class ConcreteDecoratorA : Decorator
    {
        public ConcreteDecoratorA(Component comp) : base(comp)
        {
        }
        // Decorator có thể gọi việc thực thi của hoạt động cha, thay vì gọi trực
        // tiếp đối tượng được bao bọc. Cách tiếp cận này đơn giản hóa việc
        // mở rộng các lớp decorator.
        public override string Operation()
        {
            return $"ConcreteDecoratorA({base.Operation()})";
        }
    }
    // Decorator có thể thực hiện hành vi của chúng trước hoặc sau lời gọi
    // đến một đối tượng được bao bọc.
    class ConcreteDecoratorB : Decorator
    {
        public ConcreteDecoratorB(Component comp) : base(comp)
        {
        }
        public override string Operation()
        {
            return $"ConcreteDecoratorB({base.Operation()})";
        }
    }
    
    public class Client
    {
        // Client hoạt động với tất cả các đối tượng bằng giao diện Component. 
        // Bằng cách này, nó có thể độc lập với các lớp cụ thể của các thành phần 
        // mà nó hoạt động cùng.
        public void ClientCode(Component component)
        {
            Console.WriteLine("RESULT: " + component.Operation());
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
           // Bằng cách này, client có thể hỗ trợ cả hai component đơn giản...
            var simple = new ConcreteComponent();
            Console.WriteLine("Client: I get a simple component:");
            client.ClientCode(simple);
            Console.WriteLine();
            // ...cũng như decorator.
            //
            // Lưu ý cách decorator có thể bọc không chỉ các component 
            // đơn giản mà còn cả các decorator khác.
            ConcreteDecoratorA decorator1 = new ConcreteDecoratorA(simple);
            ConcreteDecoratorB decorator2 = new ConcreteDecoratorB(decorator1);
            Console.WriteLine("Client: Now I've got a decorated component:");
            client.ClientCode(decorator2);
        }
    }
}

Kết quả

Client: I've got a simple component:
RESULT: ConcreteComponent
Client: Now I've got a decorated component:
RESULT: ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))

Đã đăng vào

trong

,

bởi

Thẻ:

Bình luận

Để lại một bình luận

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 *