策略模式(strategy)

策略模式(strategy):定义了算法家族,并封装起来,让它们之间可以相互替换,此模式让算法替换不影响使用算法的客户。

 

实现代码
/// <summary>
/// 抽象算法类
/// </summary>
abstract class Strategy
{
//算法方法
public abstract void Method();
}

/// <summary>
/// 具体算法1
/// </summary>
class Method1 : Strategy
{
public override void Method()
{
Console.WriteLine(
"具体算法1");
}
}

/// <summary>
/// 具体算法2
/// </summary>
class Methord2 : Strategy
{
public override void Method()
{
Console.WriteLine(
"具体算法2");
}
}


class Content
{
private Strategy methord;

public Content(Strategy Methord)//初始化时传入具体的策略对象
{
this.methord = Methord;
}

public void GetMethord()
{
methord.Method();
//执行策略对象方法
}
}


//客户端
class Client
{
void Main(string[] args)
{
Content content;
Method1 m1
= new Method1();//生成一个策略
content = new Content(m1);//将策略交给
content.GetMethord();//执行策略

Methord2 m2
= new Methord2();//生成一个策略
content = new Content(m2);
content.GetMethord();

}
}

实例应用:商场结账时会有几种情况:1、正常原价结账;2、打八折;3、满300赠100  等多种方式

分析:该需求总结起来就是根据原价计算价格,都是结构相同但实现不同的算法,同时算法间经常替换

实现代码
namespace WindowsFormsApplication1.Strategy
{
/// <summary>
/// 结算方法抽象父类
/// </summary>
abstract class CashBase
{
/// <summary>
/// 计算收取多少现金
/// </summary>
/// <param name="Money">原价</param>
/// <returns>应收价</returns>
public abstract double AcceptCash(double Money);
}

/// <summary>
/// 结算方法生产工厂
/// </summary>
class CashFactory
{
public static CashBase CreateCashAccepter(string AcceptType)
{
CashBase res
= null;
switch (AcceptType)
{
case "正常收费":
res
= new CashNormal();
break;
case "满300送100":
res
= new CashReturen("300", "100");
break;
case "打八折":
res
= new CashRebate("0.8");
break;
}
return res;
}
}

/// <summary>
/// 结算方法控制
/// </summary>
class CashContex
{
private CashBase cashAccepter;

public CashContex(CashBase cashAccepter)
{
this.cashAccepter = cashAccepter;
}

public double GetResult(double Money)
{
return cashAccepter.AcceptCash(Money);
}
}

/// <summary>
/// 正常收费
/// </summary>
class CashNormal:CashBase
{
public override double AcceptCash(double Money)
{
return Money;
}
}

/// <summary>
/// 打折收费
/// </summary>
class CashRebate:CashBase
{
private double moneyRebate = 1.0d;

public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}

public override double AcceptCash(double Money)
{
return Money * moneyRebate;
}
}

/// <summary>
/// 满款返款
/// </summary>
class CashReturen:CashBase
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;

public CashReturen(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;
}
}

/// <summary>
/// 客户端代码
/// </summary>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
cbx_Type.Items.AddRange(
new Object[] { "正常收费", "满300送100", "打八折" });
cbx_Type.SelectedIndex
= 0;
}

private void bt_OK_Click(object sender, EventArgs e)
{
Strategy.CashBase moneyAccepter
= Strategy.CashFactory.CreateCashAccepter(cbx_Type.SelectedItem.ToString());
lb_AcceptMoney.Text
= moneyAccepter.AcceptCash(double.Parse(tbx_Number.Text.Trim()) * double.Parse(tbx_SigPrice.Text.Trim())).ToString();
}
}
}

 

注:代码中客户端获得具体结算方法中添加了简单工厂模式
回顾:策略模式(strategy)是一种定义一系列算法的方法 ,从概念上看,这些算法完成的是相同的工作,只是实现不同,它可以以相同的方式调用所有算法,减少了算法类与算法使用类之间的耦合。

posted @ 2011-01-06 10:51  煤矿  阅读(498)  评论(0)    收藏  举报