一、概念
- 官方的的定义就是一个类的行为或其算法可以在运行时更改。
二、场景
- 许多相关的类仅仅是行为有异;
- 需要使用一个算法的不同变体;
- 算法使用客户不应该知道的数据;
- 一个类定义了多种行为,并且这些行为在类的操作中以多个条件语句的形式出现。
三、实现
- 条件
- C#
- 场景
以老人、家长、孩子为例用不同的算法计算结果为例实现策略模式。 - 代码实现
- 新建加法类,类名:Add
using System; using System.Collections.Generic; using System.Text; namespace StrategyPattern { public class Add : ICalculate { public double Sum(int num, int num1) { Console.WriteLine($"Add:结果{num+num1}"); return num + num1; } } }
- 新建乘法类,类名:Multiplication
using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; namespace StrategyPattern { public class Multiplication : ICalculate { public double Sum(int num, int num1) { Console.WriteLine($"Multiplication结果为:{num* num1}"); return num * num1; } } }
- 新建除法类,类名:Division
using System; using System.Collections.Generic; using System.Text; namespace StrategyPattern { public class Division : ICalculate { public double Sum(int num, int num1) { Console.WriteLine($"division结果为:{num / num1}"); double aa = (num * 0.1) / (num1 * 0.1); return (num * 0.1) / (num1 * 0.1); } } }
- 新建减法类,类名:Subtraction
using System; using System.Collections.Generic; using System.Text; namespace StrategyPattern { public class Subtraction : ICalculate { public double Sum(int num, int num1) { Console.WriteLine($"Subtraction结果:{num- num1}"); return num - num1; } } }
- 新建接口类,类名:ICalculate
using System; using System.Collections.Generic; using System.Text; namespace StrategyPattern { public interface ICalculate { /// <summary> /// 算数 /// </summary> /// <param name="num"></param> /// <param name="num1"></param> double Sum(int num,int num1); } }
- 启动类,类名:Program
using System; namespace StrategyPattern { internal class Program { /// <summary> /// 策略模式 /// </summary> /// <param name="args"></param> static void Main(string[] args) { ICalculate calculate = new Add(); double result = calculate.Sum(1, 2); Console.WriteLine($"Add:{result}"); ICalculate calculate1 = new Division(); double result1 = calculate1.Sum(1, 2); Console.WriteLine($"Division:{result1}"); ICalculate calculate2 = new Multiplication(); double result2 = calculate2.Sum(1, 2); Console.WriteLine($"Multiplication:{result2}"); ICalculate calculate3 = new Subtraction(); double result3 = calculate3.Sum(1, 2); Console.WriteLine($"Subtraction:{result3}"); } } }
- 新建加法类,类名:Add
四、优缺点
- 优点
- 易维护,避免重复的If…else。
- 缺点
- 增加很多的策略类。