您的位置:首页 > 编程语言 > C#

C#设计模式之策略模式(Strategy Pattern)

2016-10-07 19:27 357 查看
概述:

       策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

模式类型: 行为类模式。

这个模式涉及到三个角色:

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

应用场景案例:

某商场销售系统采用了三种收费逻辑:

一.正常收费

二.返现收费(如:满300返20)

三.打折收费(如:打8折)

UML图:





代码实现:

1.建立抽象类:CashSuper

public abstract class CashSuper
{
public abstract double acceptCash(double money);
}


2.分別实现三种业务逻辑的子类:CashNormal, CashRebate, CashReturn

public class CashNormal:CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
public 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;
}
}
public 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 result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
return result;
}
}


3.建立环境角色类: CashContext
public class CashContext
{
private CashSuper cs;
public CashContext(string type)
{
//Simple Facotry
switch (type)
{
case "Normal":
this.cs = new CashNormal();
break;
case "Return":
this.cs = new CashReturn("300", "20");
break;
case "Rebate":
this.cs = new CashRebate("0.8");
break;
}
}
public double Getrsult(double money)
{
return cs.acceptCash(money);
}
}

4.客户端调用:

public class Client
{
public Client()
{
double totalPrices = 0d;
CashContext csuper = new CashContext("Return");
totalPrices += csuper.Getrsult(800 * 12.99);
csuper = null;
CashContext csuper1 = new CashContext("Normal");
totalPrices += csuper1.Getrsult(120 * 8.99);
csuper1 = null;
CashContext csuper2 = new CashContext("Rebate");
totalPrices += csuper2.Getrsult(100 * 3.99);
csuper2 = null;
}
}


以上案例实际上是将 Strategy与Simple Factory 结合起来在使用. 这样做比单独用 Strategy 的好处是:將switch判断从客户端移到了CashContext里,
对客户端与业务逻辑层进行了解耦; 同时,Strategy模式又简化了客户端的调用, 从原来Simple Factory模式时必须认识两个类:工厂类和产品抽象类, 简化为只需要认识 CashContext 即可. 即使后续需要扩展收费方式,也不需要改动了客户端代码.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息