zoukankan      html  css  js  c++  java
  • 策略模式(Strategy Pattern)

    模式定义

    策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。

    UML类图

    • 环境类(Context) 依赖策略类,在解决某个问题时可以通过传入的参数采用不同的策略;
    • 抽象策略类(Strategy) 声明所支持算法的抽象方法。
    • 具体策略类(ConcreteStrategy) 抽象策略类的子类,实现了在抽象策略类中定义的算法。

    代码结构

    public class StrategyApp
    	{
    		public void Run()
    		{
    			Context context;
    			context = new Context(new ConcreteStrategyA());
    			context.ContextInterface();
    
    			context = new Context(new ConcreteStrategyB());
    			context.ContextInterface();
    		}
    	}
    
    	abstract class Strategy
    	{
    		public abstract void AlgorithmInterface();
    	}
    
    	class ConcreteStrategyA : Strategy
    	{
    		public override void AlgorithmInterface()
    		{
    			Console.WriteLine( "Called ConcreteStrategyA.AlgorithmInterface()");
    		}
    	}
    
    	class ConcreteStrategyB : Strategy
    	{
    		public override void AlgorithmInterface()
    		{
    			Console.WriteLine("Called ConcreteStrategyB.AlgorithmInterface()");
    		}
    	}
    
    	class Context
    	{
    		private Strategy _strategy;
    
    		public Context(Strategy strategy)
    		{
    			this._strategy = strategy;
    		}
    
    		public void ContextInterface()
    		{
    			_strategy.AlgorithmInterface();
    		}
    	}
    

    情景案例

    定义不同的排序算法

    class MainApp
    	{
    		static void Main()
    		{
    			SortedList studentRecords = new SortedList();
    
    			studentRecords.Add("Samual");
    			studentRecords.Add("Jimmy");
    			studentRecords.Add("Sandra");
    			studentRecords.Add("Vivek");
    			studentRecords.Add("Anna");
    
    			studentRecords.SetSortStrategy(new QuickSort());
    			studentRecords.Sort();
    
    			studentRecords.SetSortStrategy(new ShellSort());
    			studentRecords.Sort();
    
    			Console.ReadKey();
    		}
    	}
    
    	/// <summary>
    	/// 抽象算法
    	/// </summary>
    	abstract class SortStrategy
    	{
    		public abstract void Sort(List<string> list);
    	}
    
    	/// <summary>
    	/// 快速排序算法
    	/// </summary>
    	class QuickSort : SortStrategy
    	{
    		public override void Sort(List<string> list)
    		{
    			list.Sort(); // Default is Quicksort
    
    			Console.WriteLine("QuickSorted list ");
    		}
    	}
    
    	/// <summary>
    	/// 插入排序
    	/// </summary>
    	class ShellSort : SortStrategy
    	{
    		public override void Sort(List<string> list)
    		{
    			//list.ShellSort(); not-implemented
    			Console.WriteLine("ShellSorted list ");
    		}
    	}
    
    	/// <summary>
    	/// 环境类
    	/// </summary>
    	class SortedList
    	{
    		private List<string> _list = new List<string>();
    		private SortStrategy _sortstrategy;
    
    		public void SetSortStrategy(SortStrategy sortstrategy)
    		{
    			this._sortstrategy = sortstrategy;
    		}
    
    		public void Add(string name)
    		{
    			_list.Add(name);
    		}
    
    		public void Sort()
    		{
    			_sortstrategy.Sort(_list);
    
    			foreach (string name in _list)
    			{
    				Console.WriteLine(" " + name);
    			}
    			Console.WriteLine();
    		}
    	}
    
  • 相关阅读:
    使用NetworkX进行社交分析
    文本情感分析
    使用NLTK进行基础的NLP处理
    使用pandas对文本数据进行处理
    文本处理
    分类器可视化
    无监督学习
    监督学习2
    模型验证
    Netty学习摘记 —— 预置SSL / HTTP / WebSocket编解码器
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8447112.html
Copyright © 2011-2022 走看看