Stragety策略模式属于行为型设计模式,该定义了一系列算法,封装了每个算法,并使它们可以互换。这种模式使算法能够独立于使用它的客户而变化。
Design Pattern:Stragety 🔗
基本介绍 🔗
构成 🔗
- Context:上下文类,持有并维护一个Strategy类的引用,并定义访问Strategy类的接口。
- Strategy:抽象策略类,定义公共算法接口,各种不同的算法以不同的方式实现这个接口。
- ConcreteStrategy:具体策略类,实现Strategy类定义的算法接口。
优点 🔗
- 允许客户端选择在运行时使用的算法。
- 将每个算法封装在一个类中,使其易于修改和扩展而不影响其他算法。
- 避免使用多重条件选择语句。
缺点 🔗
- 客户必须了解所有的具体策略类。
- 定了许多策略类,增加了对象数量。
实例 🔗
C#中策略模式的实例,马上到10号了,又要给员工开发发工资了,我们计算一下每个员工的工资。
/// <summary>
/// 上下文类
/// </summary>
public class Context
{
private SalaryCalculator _calculator;
public Context(SalaryCalculator state)
{
_calculator = state;
}
/// <summary>
/// 设置工资计算器
/// </summary>
/// <param name="state"></param>
public void SetSalaryCalculator(SalaryCalculator state)
{
_calculator = state;
}
/// <summary>
/// 获取工资
/// </summary>
/// <returns></returns>
public int GetSalary()
{
return _calculator.GetSalary();
}
}
/// <summary>
/// 抽象策略类 - 工资计算器
/// </summary>
public abstract class SalaryCalculator
{
/// <summary>
/// 获得工资
/// </summary>
public abstract int GetSalary();
}
/// <summary>
/// 策划计算器
/// </summary>
public class PlanningSalaryCalculator : SalaryCalculator
{
public override int GetSalary()
{
Console.WriteLine("我是策划,工资 = 基本工资 + 流水提成");
return 20000;
}
}
/// <summary>
/// 程序工资计算器
/// </summary>
public class EngineerSalaryCalculator : SalaryCalculator
{
public override int GetSalary()
{
Console.WriteLine("我是程序,工资 = 基本工资");
return 12000;
}
}
/// <summary>
/// 测试工资计算器
/// </summary>
public class TestingSalaryCalculator : SalaryCalculator
{
public override int GetSalary()
{
Console.WriteLine("我是测试,工资 = 基本工资");
return 10000;
}
}
实际运行:
PlanningSalaryCalculator planningSalaryCalculator = new PlanningSalaryCalculator();
EngineerSalaryCalculator engineerSalaryCalculator = new EngineerSalaryCalculator();
TestingSalaryCalculator testingSalaryCalculator = new TestingSalaryCalculator();
Context context = new Context(planningSalaryCalculator);
context.GetSalary();
context.SetSalaryCalculator(engineerSalaryCalculator);
context.GetSalary();
context.SetSalaryCalculator(testingSalaryCalculator);
context.GetSalary();
结论 🔗
搬砖愉快!