小言_互联网的博客

设计模式(17)----- 策略模式

323人阅读  评论(0)

概念:

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

意图:

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:

在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

优点:

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点:

  1. 客户端必须要知道所有的策略类,否则你不知道该使用那个策略,所以策略模式适用于提前知道所有策略的情况下。
  2. 策略类数量增多(每一个策略类复用性很小,如果需要增加算法,就只能新增类)

模式的结构

策略模式的主要角色如下。

抽象策略(Strategy)类:

定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

具体策略(Concrete Strategy)类:

实现了抽象策略定义的接口,提供具体的算法实现。

环境(Context)类:

持有一个策略类的引用,最终给客户端调用。

实现类图:

抽象策略(Strategy)类:计算工资

public abstract class 计算工资
{
   
    private int baseSalary;//基础工资
    private int subsidy;//补贴
    public 计算工资(int baseSalary, int subsidy)
    {
   
        this.baseSalary = baseSalary;
        this.subsidy = subsidy;
    }
    //得到当前工资总数
    virtual public int GetSalary()
    {
   
        return baseSalary + subsidy;
    }
}

具体策略(Concrete Strategy)类:
程序员工资算法

public class 程序员工资算法 : 计算工资
{
   
    private int projectBonus;//项目奖金

    public 程序员工资算法(int baseSalary, int subsidy)
        : base(baseSalary, subsidy)
    {
    }
    public int ProjectBonus
    {
   
        set {
    projectBonus = value; }
        get {
    return projectBonus; }
    }
    //加上项目奖金
    public override int GetSalary()
    {
   
        return base.GetSalary() + this.projectBonus;
    }
}

测试员工资算法

public class 测试员工资算法 : 计算工资
{
   
    private int bugs;//发现Bug数

    public int Bugs {
    get => bugs; set => bugs = value; }

    public 测试员工资算法(int baseSalary, int subsidy)
        : base(baseSalary, subsidy)
    {
    }
    //每发现一个Bug200块钱
    public override int GetSalary()
    {
   
        return base.GetSalary() + bugs * 200;
    }
}

环境(Context)类:员工

public class 员工
{
   
    private string job;//职业
    计算工资 startegy;//选择哪种算法

    public string Job {
    get => job; set => job = value; }

    public 员工(计算工资 startegy)
    {
   
        this.startegy = startegy;
    }
    public int GetSalary()
    {
   
        return startegy.GetSalary();
    }
    //做工作
    public void DoWork()
    {
   
        throw new System.NotImplementedException();
    }
}

测试:

using System;

class Program
{
   
    static void Main(string[] args)
    {
   
        程序员工资算法 stategy = new 程序员工资算法(10000, 2000);
        员工 c = new 员工(stategy);
        stategy.ProjectBonus = 10000;
        c.Job = "程序员";
        Console.WriteLine(c.Job + c.GetSalary());

        测试员工资算法 stategy1 = new 测试员工资算法(10000, 2000);
        员工 c1 = new 员工(stategy1);
        stategy1.Bugs = 20;
        c1.Job = "测试员";
        Console.WriteLine(c1.Job + c1.GetSalary());

        Console.Read();
    }
}

输出示例:


转载:https://blog.csdn.net/weixin_49397205/article/details/113449110
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场