概念:
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
意图:
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点:
- 客户端必须要知道所有的策略类,否则你不知道该使用那个策略,所以策略模式适用于提前知道所有策略的情况下。
- 策略类数量增多(每一个策略类复用性很小,如果需要增加算法,就只能新增类)
模式的结构
策略模式的主要角色如下。
抽象策略(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
查看评论