策略模式是用来封装了算法的;只要在分析过程中听到需要在不同时间内响应不同的业务规则,就可以考虑使用策略模式。
例子: 超市的结算系统。
1)打折 8折,3折 2)返利 满300-100,满100-20 3)不打折
首先要将 界面的类 和 逻辑类 严格分开来。 这样逻辑类就可以运行在不同的系统上。
遇到上面的例子首先按照下面步骤想
1.不打折,打折,返利 可以分为3个算法类,共同继承一个抽象类
2.打折 的具体折扣,8折,3折 是灵活的,设计的时候 要留意
3.返利 的具体返利金额不同时期是不同的,所以设计的时候要留2个参数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
///
///例子:超市结算系统。不打折结算,打折计算,返利结算
///
namespace 策略模式
{
abstract class cashSuper
{
public abstract double acceptCash(double price); //price原价
}
/// <summary>
/// 不打折结算类
/// </summary>
class cashSuperNormal:cashSuper
{
public override double acceptCash(double price)
{
return price;
}
}
/// <summary>
/// 具体折扣,比如:8折,6折。
/// </summary>
class cashSuperRebate : cashSuper
{
public double rebateCount=1d; //折扣参数
/// <summary>
/// 初始化 折扣参数
/// </summary>
/// <param name="rebateCount">折扣参数</param>
public cashSuperRebate(string rebateCount) //疑问,参数是string 然后再转换,还是直接为double的更好
{
this.rebateCount = double.Parse(rebateCount);
}
public override double acceptCash(double price)
{
return price * (this.rebateCount/10);
}
}
class cashSuperFanli : cashSuper
{
public double fanliMoney = 0d;
public double fanliCondition = 0d;
/// <summary>
///
/// </summary>
/// <param name="fanliMoney">返利金额</param>
/// <param name="fanlicondition">返利条件(满多少才返)</param>
public cashSuperFanli(string fanliMoney, string fanlicondition)
{
this.fanliMoney =double.Parse(fanliMoney);
this.fanliCondition = double.Parse(fanlicondition);
}
public override double acceptCash(double price)
{
double result = price;
if (price > fanliCondition)
{
result = price - fanliMoney;
}
return result;
}
}
/// <summary>
/// 工厂类:根据参数 用来判断用哪个实例。此时用有个弊端。
/// </summary>
class cashSuperFactory
{
//根据传参
public static cashSuper createCashSuper(string type)
{
cashSuper cs = null;
switch (type)
{
case "正常收费":
cs=new cashSuperNormal();
break;
case "8折":
cs = new cashSuperRebate("8"); //假如是9折的话,1折的话,此处的参数就不好了。最好再设计个类。
break;
}
return cs;
}
}
/// <summary>
/// 上下文类,客户端只需要知道context类就行了,降低了耦合度。
/// 另外:几折和返利额度可以通过 界面中的值传值过来,如果后期需要修改 折数 只需要修改 context类即可了。
/// </summary>
class context
{
cashSuper cs = null;
/// <summary>
/// 此处就是工厂类的思想,根据参数来实例化不同对象
/// </summary>
/// <param name="type"></param>
public context(string type)
{
switch (type)
{
case "正常收费":
cs = new cashSuperNormal();
break;
case "8折":
cs = new cashSuperRebate("8");
break;
case "300返100":
cs = new cashSuperFanli("100", "300");
break;
}
}
public double getResult(double money)
{
return cs.acceptCash(money);
}
}
}
总结: 策略设计模式就是 界面类 和逻辑类 分开; 界面调用逻辑类的时候,要耦合性低即 越少知道逻辑类 最好。
类分开,耦合性低
单一职责: 一个类的修改要有修改的原因,尽量让类只一个功能。就像DV 只有DV 的功能,而手机又可以照相有可以DV。 而手机的每个功能效果都一般。