断断续续总算看完了这一节,下面小总结一下。
策略模式,它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
样例:
//抽象算法类
abstract class Strategy //Strategy类,定义所有支持的算法的公共接口
{
//算法方法
public abstract void AlgorithmInterface();
}
ConcreteStrategy,封装了具体的算法或行为,继承于Strategy
class ConcreteStrategyA:Strategy //具体算法A
{
public override void AlgorithmInterface() //算法A实现方法
{
Console.WriteLine("算法A实现");
}
}
class ConcreteStrategyB:Strategy //具体算法B
{
public override void AlgorithmInterface() //算法A实现方法
{
Console.WriteLine("算法B实现");
}
} class ConcreteStrategyC:Strategy //具体算法C
{
public override void AlgorithmInterface() //算法A实现方法
{
Console.WriteLine("算法C实现");
}
}Context,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
//上下文
class Context
{
Strategy strategy;
public Context (Strategy strategy) //初始化时,传入具体的策略对象
{
this.strategy=strategy;
}
public void ContextInterface (Strategy strategy) //上下文接口 根据具体的策略对象,调用其算法的方法
{
strategy.AlgorithmInterface();
}
}
客户端代码
static void Main(string[] args)
{
Context context;
context=new Context(new ConcreteStrategyA()); //由于实例化不同的策略,所以最终在调用context.ContextInterface();时,所获得得结果就不尽相同
context.ContextInterface();
context=new Context(new ConcreteStrategyB());
context.ContextInterface();
context=new Context(new ConcreteStrategyC());
context.ContextInterface();
}
下面是一个demo,用于实现商场的计费软件。可以填写商品个数,商品单价,优惠情况(正常,八折,满三百返一百等),根据不同得优惠得到总消费。
当用策略模式实现功能时,会发现策略得选择是在客户端实现得,没有降低客户端得压力。所以可以试着将简单工厂模式和策略模式相结合,将策略得选择放在
Context类中实现,这样客户端只需要传入对应得优惠方式,只需要认识Context类就可以了。下面是简单得实现:
public abstract class CashSuper { //抽象基础基类,抽取公共得方法
public abstract double getCash(double money);
}
public class NormalCash extends CashSuper { //正常类子类
@Override
public double getCash(double money) {
return money;
}
}
public class ReturnCash extends CashSuper { //返回类子类
String conditation; //conditation是满多少
String back; //back是返多少
public ReturnCash(String conditation,String back){
this.conditation=conditation;
this.back=back;
}
@Override
public double getCash(double money) { //money传入得总钱数
return money-money/Double.valueOf(conditation)*Double.valueOf(back);
}
}
public class DebateCash extends CashSuper { //打折子类
String debate; //打折百分比
public DebateCash(String debate){
this.debate=debate;
}
@Override
public double getCash(double money) {
return money*Double.valueOf(debate);
}
}
public class CashContext { //Context类,根据type类型选择对应得策略,调用对应策略得对应方法
CashSuper cashsuper = null;
public CashContext(String type) {//type为传入得优惠方式
switch (type) {
case "正常":
cashsuper = new NormalCash();
break;
case "打八折":
cashsuper = new DebateCash("0.8");
break;
case "满三百返一百":
cashsuper = new ReturnCash("300", "100");
break;
default:
break;
}
}
public double getRes(double money) {
return cashsuper.getCash(money);//调用对应策略得对应优惠方法
}
}
客户端代码:
CashContext context=new CashContext("满三百返一百");//根据传入得优惠方法选择对应得优惠策略
res.setText(context.getRes(total)+"");//total为总消费数,调用对应策略得方法获取优惠后得总价格
策略模式是一种定义一系列算法得方法,从概念上来看,所有这些算法完成得都是相同得工作,只是实现不同,它可以以相同得方式调用所有得方法,减少了各种算法类与使用算法类之间得耦合。
策略模式得strategy类层次为context定义了一系列得可供重用得算法或行为。继承有助于析取出这些算法中得公共功能。
策略模式得优点是简化了单元测试,因为每个算法都有自己得类,可以通过自己得接口单独测试。