一、概念
策略模式的用意是针对一组算法,将每一个算法封装到具有有共同接口的独立类中。从而使得他们之间可以相互替换。
策略模式使得算法可以在不影响客户端的情况下发生改变。
二、策略模式的结构
//抽象共同类
public abstract class Stategy
{
public abstract void function();
}
//算法类1
public calss StategyA
{
public void function()
{
//A实现方法
}
}
//算法类2
public calss StategyB
{
public void function()
{
//B实现方法
}
}
//算法类3
public calss StategyC
{
public void function()
{
//C实现方法
}
}
//实现算法的调用类,和客户段进行交互。
public class Context
{
strategy stra;
public Context(strategy stray)
{
stra=stray;
}
public void func()
{
stra.function();
}
}
三、使用场景我们知道每家公司在计算员工工资时,根据职位,级别等不同,对应的工资算法就不同,现在我们如果要设计一个计算工资的软件:
不采用‘策略模式’应该是这样实现的:
//技术工资算法
public class Techlogy
{
//技术员工资算法
public double GetMoney()
{
return TechlogyMoney;
}
}
//销售工资算法
public class SaleUser
{
//销售员工资算法
public double GetMoney()
{
return SaleMoney;
}
}
//客户段程序
public class program
{
public void main()
{
//工资
double money=0;
switch(Type)
{
case "技术":Techlogy th=new Techlogy();
money=th. GetMoney();break;
case "销售":SaleUser sale=new SaleUser();
money=sale. GetMoney();break;
}
}
}
//缺点,若要增加 财务的工资算法 ,除了增加算法类之外 还要改动 客户端程序,而且将所有的算法类都暴露给了客户端,违反了 开放-封闭原则。
用策略模式进行改造
//定义算法抽象类
public abstract clss GzSuanfa
{
//抽象工资计算方法
public abstract double GetMoney();
}
//技术工资算法
public class Techlogy:GzSuanfa
{
//技术员工资算法
public double GetMoney()
{
return TechlogyMoney;
}
}
//销售工资算法
public class SaleUser:GzSuanfa
{
//销售员工资算法
public double GetMoney()
{
return SaleMoney;
}
}
//策略模式的方法集合
public void ContextMoney
{
GzSuanfa gzsf;
//这里用到了简单工厂模式
public ContextMoney(string type)
{
switch(Type)
{
case "技术":gzsf=newTechlogy ();
case "销售":gzsf=new(SaleUser();
}
}
public double GetGzRmb()
{
return gzsf.GetMoney();
}
}
//客户段程序
public class program
{
public void main()
{
//工资算法(策略模式)
ContextMoney cmy=new ContextMoney(type);
//工资
double money=cmy. GetMoney();;
}
}