二、策略模式(Strategy)

一、概念

策略模式的用意是针对一组算法,将每一个算法封装到具有有共同接口的独立类中。从而使得他们之间可以相互替换。

策略模式使得算法可以在不影响客户端的情况下发生改变。

二、策略模式的结构


//抽象共同类

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

}

}







猜你喜欢

转载自blog.csdn.net/xiangwenfly/article/details/53764853
今日推荐