一,解释:
1,书上的解释:
策略模式定义了家族算法,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不回影响到使用算法的客户。
2,自己的理解:
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理(属于行为型模式)
二,用法:
1,什么时候用?
一个系统有很多很多类,而且唯一能够区分它们的就是他们自己的行为的时候
2,如何用?
将这些算法封装为一个一个的类,任意替换
3,重点是什么?
策略模式有三个主要的角色:抽象策略,具体策略,环境类(环境类用于引用)
4, UML图
5,优缺点是什么?
(1)优点:
扩展更加方便
可以自由切换算法
(2)缺点:
会有很多的具体策略类
6,相关的例子
(1)让厨子做什么菜品,他就会做什么,都会有相应的一个做菜的策略
(2)关于商场打折,当季衣服不打折,上一季衣服大致力度很大
三,代码:
1,商场打折为例子:
先有一个抽象现金类,写出具体类都共有的方法:
abstract class CashSuper//抽象现金类
{
public abstract double acceptCash(double money);
}
2,几种不同的促销活动的打折力度的类:没有折扣——打折——满几百返几百
class CashNomal: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 moneyConsition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyConsition,string moneyReturn)
{
this.moneyConsition = double.Parse(moneyConsition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double acceptCash(double money)
{
double result = money;
if (money >= moneyConsition)
result = money - Math.Floor(money / moneyConsition) * moneyReturn;
return result ;
}
}
3,具体的策略:包装所有的行为,利用context的 构造函数来来连接到抽象类,并算钱
class CashContext
{
private CashSuper cs;
public CashContext (CashSuper csuper)
{
this.cs = csuper;
}
public double getresult(double money)
{
return cs.acceptCash(money);
}
}
4,客户端:(有窗体)
double total = 0.0d;
private void button1_Click(object sender, EventArgs e)
{
CashContext cc = null;
switch (comboBox1 .SelectedItem.ToString ())
{
case "正常消费":
cc = new CashContext(new CashNomal());
break;
case "满300减100":
cc = new CashContext(new CashReturn("300", "100"));
break;
case "打8折":
cc = new CashContext(new CashRebate("0.8"));
break;
double totalPrice = 0d;
totalPrice = cc.getresult(Convert.ToDouble(textBox1.Text) * Convert.ToDouble(textBox2.Text));
totalPrice = totalPrice + total;
listBox1.Items.Add("单价" + textBox1 + "数量" + textBox2 + "种类" + comboBox1 + "合计" + totalPrice);
label5.Text = total.ToString();
}
}