策略模式:定义一系列算法,把它们封装起来,使得算法可独立于它们的用户而变化
例子:公司里不同职位工资不一样,普通员工工资低点,而高管工资高点
类图:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
public sealed class SalaryContext
{
private ISalaryStrategy salary;
public SalaryContext(ISalaryStrategy salary)
{
this.salary = salary;
}
//public ISalaryStrategy salaryStrategy
//{
// get { return salary; }
// set { salary = value; }
//}
public void GetSalary(double income)
{
salary.CalculateSalary(income);
}
}
//抽象策略角色
public interface ISalaryStrategy
{
void CalculateSalary(double income);
}
//程序员工资,具体策略角色
public sealed class ProgrammerSalary : ISalaryStrategy
{
public void CalculateSalary(double income)
{
Console.WriteLine("程序员基本工资:" + income + "+加班费+项目奖金*10%");
}
}
//正式员工
public sealed class NormalPeopleSalary : ISalaryStrategy
{
public void CalculateSalary(double income)
{
Console.WriteLine("正式员工基本工资:" + income + "+加班费");
}
}
//CEO工资
public sealed class CEOSalary : ISalaryStrategy
{
public void CalculateSalary(double income)
{
Console.WriteLine("CEO基本工资:" + income + "+项目奖金*30%+公司股票");
}
}
class Program
{
static void Main(string[] args)
{
SalaryContext salaryContext = new SalaryContext(new NormalPeopleSalary());
salaryContext.GetSalary(3000);
salaryContext = new SalaryContext(new ProgrammerSalary());
salaryContext.GetSalary(8000);
Console.ReadKey();
}
}
}
正式员工基本工资:3000+加班费
程序员基本工资:8000+加班费+项目奖金*10%
优点:
1】、策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
2】、易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。
3】、避免使用多重条件选择语句,充分体现面向对象设计思想。
缺点:
1】、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2】、策略模式会造成很多的策略类。