[Design-Pattern] Decorator Pattern

Decorator Pattern - 裝飾模型

Decorator Pattern 也可以稱作 Wrapper Patter。

優點

1. 動態新增功能至已存在的類別
2. 另一種子類別(抽象類別)
3. 支援開閉原則

何時去使用

1. 大型系統(Legacy System)
2. 控制項(Controller)
3. Sealed Class

介面

public interface ICar
    {
        double GetCost();
        string GetName();
    }

被裝飾者類別 (Component)

public class Car:ICar
    {
        public double GetCost()
        {
            return 600000;
        }

        public string GetName()
        {
            return "Car";
        }
    }

抽象類別

public abstract class DecoratorAccessoryCar : ICar
    {
        private readonly ICar _car;
        public DecoratorAccessoryCar(ICar car)
        {
            this._car = car;
        }
        public virtual double GetCost()
        {
            return this._car.GetCost();
        }

        public virtual string GetName()
        {
            return this._car.GetName();
        }
    }

裝飾類別 (Decorator)

    public class BasicAccessories : DecoratorAccessoryCar
    {
        public BasicAccessories(ICar car) : base(car)
        {
        }

        public override double GetCost()
        {
            return base.GetCost()  + 20000;
        }

        public override string GetName()
        {
            return "basic package, " + base.GetName();
        }
    }

    public class AdvanceAccessories : DecoratorAccessoryCar
    {
        public AdvanceAccessories(ICar car) : base(car)
        {
        }

        public override string GetName()
        {
            return "Advance Package, " + base.GetName();
        }

        public override double GetCost()
        {
            return base.GetCost() + 50000;
        }
    }

    public class SuperAccessories : DecoratorAccessoryCar
    {
        public SuperAccessories(ICar car) : base(car)
        {
        }

        public override string GetName()
        {
            return "Super Package, " + base.GetName();
        }

        public override double GetCost()
        {
            return base.GetCost() + 100000;
        }
    }

測試

            ICar car = new Car();
            Console.WriteLine($"{car.GetName()} , Cost : {car.GetCost()}");
            var bcar = new BasicAccessories(car);
            Console.WriteLine($"{bcar.GetName()} , Cost : {bcar.GetCost()}");
            var acar = new AdvanceAccessories(bcar);
            Console.WriteLine($"{acar.GetName()} , Cost : {acar.GetCost()}");
            var scar = new SuperAccessories(acar);
            Console.WriteLine($"{scar.GetName()} , Cost : {scar.GetCost()}");
            Console.ReadLine();

Reference

  1. decorator-pattern

留言

這個網誌中的熱門文章

[Tools] GCOV & LCOV 初探

Quilt Patch 管理操作方法

[C#]C# Coding 規則