[Design-Pattern] Strategy

策略模式 - Strategy Pattern

目的 : 將各種可以互換的演算法(策略)包裝成一個類別

排序策略

父類別

先宣告一個父類別

public enum Color
    {
        Black,
        White,
        Blue,
        Gray,
        Red
    }

    public class Car
    {
        public readonly int Price;
        public readonly Color CarColor;

        public Car(int price, Color color)
        {
            this.Price = price;
            this.CarColor = color;
        }

        public override string ToString()
        {
            return $"Price : {Price}, Color : {CarColor}";
        }
    }

繼承 Comparer

透過繼承範型的 Comparer ,來實作排序演算法。

    public class SortByColor : Comparer<Car>
    {
        public override int Compare(Car o1, Car o2)
        {
            if (o1 == null || o2 == null)
                throw new ArgumentNullException();
            return (o1.CarColor > o2.CarColor) ? 1 : (o1.CarColor == o2.CarColor) ? 0 : -1;
        }
    }

    public class SortCarByPrice : Comparer<Car>
    {
        public override int Compare(Car o1, Car o2)
        {
            if (o1 == null || o2 == null)
                throw new ArgumentNullException();
            return (o1.Price > o2.Price) ? 1 : (o1.Price == o2.Price) ? 0 : -1;
        }
    }

實作測試

            var c1 = new Car(100, Color.Black);
            var c2 = new Car(50, Color.White);
            var clist = new List<Car>
            {
                c1,
                c2
            };

            clist.Sort(new SortByColor());
            foreach (var c in clist)
            {
                Console.WriteLine(c.ToString());
            }

            clist.Sort(new SortCarByPrice());
            foreach (var c in clist)
            {
                Console.WriteLine(c.ToString());
            }

簡單工廠模式 VS 策略模式


簡單工廠模式 : 用來建立物件的模式,關注物件如何被產生。
策略模式 : 一種行為,關注的是行為的封裝。

區別 : 使用時機。

留言

這個網誌中的熱門文章

[Tools] GCOV & LCOV 初探

Quilt Patch 管理操作方法

[C#]C# Coding 規則