注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

周响 廊坊师范学院九期信息技术提高班

一个世界有你 一个世界没有你 让两者的不同最大 就是你一生的意义

 
 
 

日志

 
 

策略模式  

2012-12-21 10:26:20|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式由抽象策略类、具体策略类、环境角色三部分组成。抽象策略类通常由有一个抽象类或一个接口构成,在这个抽象类或接口中定义所有支持的算法的公共接口。具体策略类继承于抽象策略类,封装了具体的算法或行为。环境角色持有一个抽象策略类的引用,用来供客户端调用。

策略模式UML图:

策略模式 - 周响 - 周响  廊坊师范学院九期信息技术提高班

 应用场景:

1.     多个类只区别在表现行为不同,可以使用策略模式来动态的选择具体要执行的行为。

2.     在不同情况下需要使用不同的算法,即只要在不同时间内需要应用不同的业务规则,就可以考虑使用策略模式处理。

策略模式的优点:

1.     提供了一种替代继承的方法,既保持了继承的优点还比继承灵活,使得算法独立可以任意扩展。

2.     实现了高内聚弱耦合。

3.     避免类程序中使用多重条件转移语句,是系统更灵活更易扩展。

4.     对客户隐藏具体的行为,算法的具体实现完全独立。

缺点:

由于每个具体类都会产生一个新类,所以会增加系统维护的类的数量。

商场促销策略模式实现代码:

抽象策略类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 策略模式
{
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
}


具体策略类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 策略模式
{
class CashNormal:CashSuper
{
public override double acceptCash(double money)
{
//throw new NotImplementedException();
return money;
}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 策略模式
{
class CashReturn:CashSuper
{
private double moneyCondition=0.0d;
private double moneyReturn=0.0d;
public CashReturn(String moneyConditon,String moneyReturn)
{
this.moneyCondition = double.Parse(moneyConditon);
this.moneyReturn = double.Parse(moneyReturn);

}
public override double acceptCash(double money)
{
double result=money;
// throw new NotImplementedException();
if (money > moneyCondition)
{
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
}

return result;
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 策略模式
{
class CashRebate:CashSuper
{
private double moneyRebate = 1d;
public CashRebate(String moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}
public override double acceptCash(double money)
{
//throw new NotImplementedException();
return money * moneyRebate;
}
}
}


环境角色Context:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 策略模式
{
class CashContext
{
private CashSuper cash;
public CashContext(string type)
{
switch (type)
{
case "正常收费":
cash = new CashNormal();
break;
case "打八折":
cash = new CashRebate("0.8");
break;
case "满300返100":
cash = new CashReturn("300","100");
break;

}
}
public double GetResult(double money)
{
return cash.acceptCash(money);
}
}
}



  评论这张
 
阅读(106)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017