策略模式


编辑说明

概述

策略模式属于行为模式

一个类的行为或其算法可以在运行时更改

它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户

结构图

 

代码实现

 策略类

这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明这是说明
    /// 
    /// 抽象算法类
    /// 
    public abstract class Strategy
    {
        public abstract void AlgorithmInterface();
    }
 /// 
    /// 算法A
    /// 
    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法A实现");
        }
    }
 /// 
    /// 算法B
    /// 
    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法B实现");
        }
    }
    /// 
    /// 算法C
    /// 
    public class ConcreteStrategyC : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法C实现");
        }
    }

Context上下文

  /// 
    /// 策略上下文
    /// 
    public class Context
    {
        Strategy strategy;
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        //上下文接口
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

主程序

  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.Read();
        }
    }

优势

将具体算法实现和对象分离开来,让实现可以独立于对象或客户端独立变化客户端只需要通过调用Context来进行对策略对象的引用

客户端中不在需要包含大量的算法实现

缺点

会产生很多策略类

客户端必须知道所有策略类

使用场景

如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

一个系统需要动态地在几种算法中选择一种。

如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现

Dome