二、策略模式(Strategy)
2016-12-20 18:00
204 查看
一、概念
策略模式的用意是针对一组算法,将每一个算法封装到具有有共同接口的独立类中。从而使得他们之间可以相互替换。
策略模式使得算法可以在不影响客户端的情况下发生改变。
二、策略模式的结构
//抽象共同类
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();;
}
}
策略模式的用意是针对一组算法,将每一个算法封装到具有有共同接口的独立类中。从而使得他们之间可以相互替换。
策略模式使得算法可以在不影响客户端的情况下发生改变。
二、策略模式的结构
//抽象共同类
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();;
}
}
相关文章推荐
- CSS学习之二实践盒子
- JSP目录
- maven项目头上有红叉解决方法
- 因为文件一事差点怀疑编译器,三份代码对比
- Redis Cluster 3.0搭建与使用
- Convert.ToInt32()和int.Parse()的区别
- PHP 汉字拼音互转
- CMD文件理解(F2810,F2812)
- java简单排序
- Python爬虫初识
- java中枚举的使用
- 自定义color文件夹来改变字体颜色
- Java注解全解析(附)——javapoet简介
- OC正则表达式的简单使用
- Cocos Creator动态加载DragonBones骨骼动画
- 对组件的引用(refs)
- 搭建LNMP网站服务平台
- sql sever 触发器的使用
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- 新版U-boot2012.04.01移植(一)(JZ2440-S3C2440)