`
isiqi
  • 浏览: 16054750 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

透析设计模式中的 策略模式

阅读更多

一、目的:

策略模式主要是用来封装算法的,当需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

二、策略模式的原理:
一个父类,下面有几个子类继承父类实现多态
一个策略类→在构造函数中传参,直接判断需要生成哪个子类;并且在另一个方法中调用指定子类的方法(完成不同的算法、业务规则……,这个方法对主程序无需知道)。
三、拿商场结账时打折和满增的例子来实现代码:
1.商场结算的抽象类
public abstract class CashSuper
{
public CashSuper()
{
}
public abstract double GetRealPrice(double money);
}
2.正常收费子类,继承CashSuper类
public class CashNormal : CashSuper
{
public CashNormal()
{
}
public override double GetRealPrice(double money)
{
return money;
}
}
3.满立减的结算类,继承CashSuper类
public class CashReturn : CashSuper
{
public double CashCondition;
public double ReturnMoney;
public CashReturn(double cashCondition, double returnMoney)
{
this.CashCondition = cashCondition;
this.ReturnMoney = returnMoney;
}
public override double GetRealPrice(double money)
{
double result=0;
if (money > CashCondition)
{
result= money - Math.Floor(money / CashCondition) * ReturnMoney;
}
return result;
}
}
4.打折的类,继承CashSuper类
public class CashRebate : CashSuper
{
public double cashRebate;
public CashRebate(double rebate)
{
this.cashRebate = rebate;
}
public override double GetRealPrice(double money)
{
return money * cashRebate;
}
}
5.策略模式的核心类(结合简单工厂模式生成不同的对象)
public class CashContext
{
CashSuper cs = null;
public CashContext(string type)//直接根据构造函数的参数来判断需要创建那个类
{
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "打八折":
cs = new CashRebate(0.8);
break;
case "满300减100":
cs = new CashReturn(300,100);
break;
default:
break;
}
}

public double GetRealMoney(double money)
{
return cs.GetRealPrice(money);//在Context类中直接调用运算,客户端无需参与无需知道
}
}

主程序main里面需要输入的代码:
private void btnOK_Click_1(object sender, EventArgs e)
{
CashContext cc = new CashContext(comboBox1.SelectedItem.ToString());
double totalPrice = cc.GetRealMoney(Convert.ToDouble(txtPerPrice.Text) * Convert.ToDouble(txtNumber.Text));
}

这里主程序只需认识策略类Context即可,连中间的方法要如何实现都不需要了解,对主程序都是封闭的。
策略模式其实跟简单工厂模式差不多,只是把生产对象的类(CreateClass)改为了Context策略类,并且在策略类中结合简单工厂模式生成对应的对象,并调用不同对象的方法实现不同的算法或业务规则(这种算法或业务规则直接就在Context类中调用了,主程序中根本不知道有这么一件事件,封装性比较好);使用策略模式在主程序中不像简单工厂模式一样需要认识两个类,而只需认识一个策略类即可,耦合性大大的提高。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics