策略模式:
它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户
//定义所有支持的算法的公共接口-------------------------------
abstract class Strategy
{
publicabstract void AlgInterface();
};
//----------------------------------------------------------
//具体算法-------------------------------------------------
class SA : Strategy
{
publicoverride void AlgInterface()
{
Console.WriteLine("算法A 实现");
}
};
class SB : Strategy
{
publicoverride void AlgInterface()
{
Console.WriteLine("算法B 实现");
}
};
class SC : Strategy
{
publicoverride void AlgInterface()
{
Console.WriteLine("算法C 实现");
}
};
//--------------------------------------------------------------
//上下文-------------------------------------------------------
class Context
{
Strategystrategy;
publicContext(Strategy strategy)
{
this.strategy= strategy;
}
publicvoid ContextInterface()
{
strategy.AlgInterface();
}
};
//--------------------------------------------------------------
//客户端
static void main()
{
Contextcontext;
context= new Context(new SA());
context.ContextInterface();
context= new Context(new SB());
context.ContextInterface();
context= new Context(new SC());
context.ContextInterface();
Console.Read();
}
简单工厂实现商场打折:
策略模式实现商场打折:
两者结合后:
abstract class CashSuper
{
publicabstract double acceptCash(double money);
};
//不打折
class CashWay1 :CashSuper
{
publicoverride double acceptCash(double money)
{
returnmoney;
}
};
//打折
class CashWay2 :CashSuper
{
//折扣
privatedouble rebate = 1d;
publicCashWay2(string rebate)
{
this.rebate= double.Parse(rebate);
}
//计算
publicoverride double acceptCash(double money)
{
returnmoney * rebate;
}
};
//返利
class CashWay3 :CashSuper
{
//消费满money, 回退moneyreturn
publicCashWay3(string money, string moneyreturn)
{
}
//...
};
//现金收费工厂类
class CashContext
{
CashSupercs = null;
publicCashContext(string type)
{
switch(type)
{
case"正常":
cc= new CashContext(new CashWay1);
break;
case"打折"
cs= new CashContext(new CashWay2("0.8"));
break;
case"返利":
cs= new CashContext(new CahsWay3("300", "100"));
break;
}
}
publicdouble GetResult()
{
returncs.acceptCash(money);
}
};
//客户端
void main()
{
CashContextcc = new CashContext("打折");
}
在简单工厂和策略模式结合下,客户端只需要知道一个CashContext类就可以了,更加降低耦合度
策略模式是一种定义一系列算法的方式,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合