设计模式——策略模式
程序员文章站
2024-02-07 19:29:04
...
初识设计模式,感觉学习起来有点吃力,不过小菜和大鸟的对话还是挺有意思的,感觉自己就是那个小菜,今天我学习了策略模式,策略模式感觉比简单工厂模式又难了一点,但是通过小菜和大鸟的对话还是能懂点,废话不多说,下面我就来讲解一下策略模式!
策略模式是什么?
它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户!
举例:
从北京到上海我们可以坐飞机,可以坐火车,可以坐高铁。这几种方法最终的目的地都是上海,起点都是北京,只不过是我们用不同的交通工具,这里的交通工具其实就是不同的算法
策略模式必须要有以下三种策略角色:
抽象策略角色(strategy):通常由一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。用来约束一些列具体的策略算法,策略上下文角色使用此策略接口来调用具体的策略所实现的算法**—— 相当于父类**
具体策略角色(ConcreteStrategyA、B、C):包装了相关算法和行为,相当于子类
环境角色(Context):持有 一个策略类的引用,最终给客户端调用。策略上下文,负责和具体的策略实现交互,通常策略上下文对象会持有一个真正的策略实现对象,策略上下文还可以让具体的策略实现从其中获取相关数据,回调策略上下文对象的方法。
UML图如下:
举例:某商场进行促销活动,分别有以下三种方式进行促销,打8折、满300返100,按原价销售。
解说:这个方案的最终结果就是要让商品卖出去,三种方法相当于三种策略,收钱是一个抽象类,相当于一个父类,而正常收费、打8折和满300返100的活动都是继承收钱这个父类,这三个相当于具体策略角色。
UML图如下所示:
具体代码如下:
抽象策略类:
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
具体策略角色:
//正常收费子类
class CashNormal1 : CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
//打折收费子类
class CashRebate : CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}
public override double acceptCash(double money)
{
return money * moneyRebate;
}
}
//返利收费子类
class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition, string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double acceptCash(double money)
{
double resultl = money;
if (money >= moneyCondition)
{
resultl = money - Math.Floor(money / moneyCondition) * moneyReturn;
}
return resultl;
}
}
环境策略角色
class CashContext
{
CashSuper cs = null;
public CashContext(string type)
{
switch(type)
{
case "正常收费":
CashNormal1 cs0 = new CashNormal1();
cs = cs0;
break;
case "满300返100":
CashReturn cr1 = new CashReturn("300", "100");
cs = cr1;
break;
case "打8折":
CashRebate cr2 = new CashRebate("0.8");
cs = cr2;
break;
}
}
public double GetResult(double money)
{
return cs.acceptCash(money);
}
}
客户端代码
double total = 0.0d;
private void btnOK_Click(object sender, EventArgs e)
{
{
CashContext csuper = new CashContext(cboType.SelectedItem.ToString());
double totalPrices = 0d;
totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
total = total + totalPrices;
lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + " " + cboType.SelectedItem + "合计:" + totalPrices.ToString());
lblResult.Text = total.ToString();
}
}
以上就是我对策略模式的理解,有什么不对的地方请大家多多指点!