策略模式
- 策略封装了变化
- 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
- 策略模式的strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于提炼出这些算法中的公共功能。
- 策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
- 当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的strategy类中,可以在使用这些行为的类中消除条件语句。
- 策略是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
- 策略模式与简单工厂模式结合后,可以将选择具体实现的职责交由上下文类承担,这就减轻了客户端的职责。
- 反射可以帮助消除上下文中的选择的职责。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a2683263847448a2928c46ba59bcbc54.png)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MarketStrategy
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ButtonCalculate_Click(object sender, EventArgs e)
{
string str = comboBoxStrategy.Text;
CashContext cash = new CashContext(str);
double productMoney = double.Parse(textBoxProductPrice.Text);
double finalMoney = cash.GetResult(productMoney);
textBoxFinalProductPrice.Text = finalMoney.ToString();
}
}
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
class CashNormal : CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
class CashRebate : CashSuper
{
private double rebate = 1.0d;
public CashRebate(double rebate)
{
this.rebate = rebate;
}
public override double acceptCash(double money)
{
return money * rebate;
}
}
class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(double moneyCondition,double moneyReturn)
{
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
public override double acceptCash(double money)
{
if (money >= moneyCondition)
{
double multi = Math.Floor(money / moneyCondition);
return money - multi * moneyReturn;
}
else
{
return money;
}
}
}
class CashFactory
{
public static CashSuper createCashAccept(string type)
{
CashSuper cs = null;
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返50":
cs = new CashReturn(300, 50);
break;
case "9折":
cs = new CashRebate(0.9);
break;
default:
break;
}
return cs;
}
}
class CashContext
{
private CashSuper cashSuper = null;
public CashContext(string type)
{
switch (type)
{
case "正常收费":
this.cashSuper = new CashNormal();
break;
case "满300返50":
this.cashSuper = new CashReturn(300, 50);
break;
case "9折":
this.cashSuper = new CashRebate(0.9);
break;
default:
break;
}
}
public double GetResult(double money)
{
return cashSuper.acceptCash(money);
}
}
}