行爲型模式之策略模式Strategy

一、認識

策略模式Strategy:定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶

 

二、使用場景說明

Strategy:聲明一個與所有支持的算法共同的接口。上下文使用此接口調用由具體策略定義的算法。

ConcreteStrategy:利用策略接口實現算法

Context:

  • 用具體策略對象配置
  • 維護對策略對象的引用
  • 可以定義允許策略訪問其數據的接口。

三、基礎模板代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 策略模式
{ 
    class Program
    {
        static void Main(string[] args)
        {
            Context context;
            context = new Context(new ConcreteStrategyA());
            context.ContextInterface();

            context = new Context(new ConcreteStrategyB());
            context.ContextInterface();

            context = new Context(new ConcreteStrategyC());
            context.ContextInterface();

            Console.WriteLine();
            Console.ReadLine();
           

        }
    }
   
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 策略模式
{
    class Context//上下文,用一個ConcreteStrategy來配置,維護一個對Strategy對象的引用
    {
        Strategy strategy;
        public Context(Strategy strategy)//初始化時,傳入具體的策略對象
        {
            this.strategy = strategy;//將參數賦值給上面的Strategy的strategy
        }
        //上下文接口
        public void ContextInterface()//根據具體的策略對象,調用其算法的方法。void爲不返回值的方法指定返回值類型。
        {
            strategy.AlgorithmInterface();
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 策略模式
{
    class ConcreteStrategyA : Strategy//具體策略類,封裝了具體的算法或行爲,繼承於Strategy
    {
        //算法A實現方法
        public override void AlgorithmInterface()//方法重寫
        {
            Console.WriteLine("算法A實現");
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 策略模式
{     //策略類,定義所有支持的算法的公共接口
     abstract class Strategy//加abstract關鍵字,表明是抽象類,還有抽象方法需要了解
    {   
         //抽象類不能實例化
         //抽象方法是必須被子類重寫的方法
         //若類中包含抽象方法,那麼類就必須定義爲抽象類,不論是否包含其他一般方法
         //算法方法
        public abstract void AlgorithmInterface();
         //在方法返回值前加abstract表明此方法是抽象方法,抽象方法沒有方法體,直接在括號後加“;”
    }
  
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章