C#设计模式之策略模式(Strategy Pattern)
2016-10-07 19:27
357 查看
概述:
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
模式类型: 行为类模式。
这个模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
应用场景案例:
某商场销售系统采用了三种收费逻辑:
一.正常收费
二.返现收费(如:满300返20)
三.打折收费(如:打8折)
UML图:
代码实现:
1.建立抽象类:CashSuper
2.分別实现三种业务逻辑的子类:CashNormal, CashRebate, CashReturn
3.建立环境角色类: CashContext
4.客户端调用:
以上案例实际上是将 Strategy与Simple Factory 结合起来在使用. 这样做比单独用 Strategy 的好处是:將switch判断从客户端移到了CashContext里,
对客户端与业务逻辑层进行了解耦; 同时,Strategy模式又简化了客户端的调用, 从原来Simple Factory模式时必须认识两个类:工厂类和产品抽象类, 简化为只需要认识 CashContext 即可. 即使后续需要扩展收费方式,也不需要改动了客户端代码.
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
模式类型: 行为类模式。
这个模式涉及到三个角色:
环境(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 即可. 即使后续需要扩展收费方式,也不需要改动了客户端代码.
相关文章推荐
- Head First 设计模式 读书摘记(二) 策略模式 C#代码
- C#面向对象模式设计第二十三讲:Startegy 策略模式(行为型模式)
- C#设计模式——策略模式(Strategy Pattern)
- [导入]C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式.zip(8.00 MB)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- C#设计模式之策略模式
- C#设计模式——策略模式
- C# 设计模式之 策略模式 示例
- 深入浅出设计模式(C#版)--策略模式
- 设计模式之(策略模式)(C#实现)(程杰)
- C# 设计模式-策略(Strategy)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- C#设计模式之22——策略模式
- C# 设计模式----策略模式
- C#设计模式之十九策略模式(Stragety Pattern)【行为型】
- c#设计模式之策略模式
- c#设计模式-策略模式
- c# 设计模式:策略模式
- c#设计模式-策略模式
- C#设计模式——策略模式(Strategy Pattern)