设计模式 - 策略模式
2016-01-23 本文已影响47人
Mitchell
-
策略模式的好处
- 可以将相同功能定义成一个模块放在一起,比如对应一个业务逻辑的多种算法。
- 首先,设计一个算法的基类,其他各个不同类型的算法类分别继承基类。
- 之后,再创建一个暴露给客户端的 控制类,由控制类去判断应该生成具体的哪个子类。
- 这样设计的好处:对于客户端来说,只需要知道这个控制类就可以了,其余的事情由控制类来做,这样也降低了耦合性。
-
实现举例
这里实现的是一个超市打折的策略,具体需求是打折的方式可能有多种,打折、返现...这里采用的是工厂+策略的设计模式
using System;
namespace Strategy
{
//支付 Base 类
abstract class CashSuper
{
public abstract double acceptMoney(double money);
}
//普通 支付
class CashNormal : CashSuper
{
private double money = 1d;
public CashNormal(double money){
this.money = money;
}
public override double acceptMoney(double money){
return this.money;
}
}
//支付返现
class CashReturn: CashSuper
{
private double fullMoney = 0d;
double returnMoney = 0d;
public CashReturn(double fullM,double returnM){
this.returnMoney = returnM;
this.fullMoney = fullM;
}
public override double acceptMoney(double money){
if (money >= fullMoney) {
return money - this.returnMoney;
} else {
return money;
}
}
}
//打折
class CashRebate: CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate){
this.moneyRebate = double.Parse(moneyRebate);
}
public override double acceptMoney(double money){
return money*this.moneyRebate;
}
}
//暴露给客户端的接口设计类
class CashContext
{
CashSuper strategy = null;
public CashContext(double money){
CashNormal cs = new CashNormal(money);
this.strategy = cs;
}
public CashContext(string rebate)
{
CashRebate cs = new CashRebate (rebate);
this.strategy = cs;
}
public CashContext(double returnM,double fullM)
{
CashReturn cs = new CashReturn (fullM, returnM);
this.strategy = cs;
}
public double GetResult(double money){
return this.strategy.acceptMoney(money);
}
}
//使用方式
class MainClass
{
public static void Main (string[] args)
{
CashContext a =new CashContext(1000,200);
double r = a.GetResult (1200);
}
}
}