陈巧倩

设计模式-策略模式

· 201 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

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();

结论 🔗

搬砖愉快!