策略设计模式
定义一个类(抽象也可以),抽象类具有代表意义,表示其他类实现这个抽象类。
namespace RunJob
{
public abstract class StrategyJob
{
public virtual void DoWork()
{
WriteLog("do work");
}
public virtual void WriteLog(string message)
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\log.txt", true))
{
file.WriteLine(DateTime.Now +" : "+ message);
}
}
}
}
几种实现功能的方式,这里说四种。
1,UPload Address
namespace RunJob
{
public class UploadAddress : StrategyJob
{
public override void DoWork()
{
WriteLog("upload Address job working now");
}
}
}
2,Upload Invoice
namespace RunJob
{
public class UploadInvoice:StrategyJob
{
public override void DoWork()
{
WriteLog("upload Invoice job working now");
}
}
}
3,Upload PO
namespace RunJob
{
//upload po
public class UploadPOJob:StrategyJob
{
public override void DoWork()
{
WriteLog("upload po job working now");
}
}
}
4,UPload Vendor
namespace RunJob
{
//upload vendor
public class UploadVendor:StrategyJob
{
public override void DoWork()
{
WriteLog("upload Vendor job working now");
}
}
}
这四种方式中,我们只需要动态调用一种就OK,我们把某种方式配置在App.config中,然后通过反射调用。
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="InvokeMethod" value="RunJob.UploadInvoice" /> </appSettings> </configuration>
这里定义Context 类,来维护StrategyJob。
namespace RunJob
{
public class Context
{
StrategyJob strategy;
public void SetWorkStrategy(StrategyJob strategy)
{
this.strategy = strategy;
}
public void DoWork()
{
strategy.DoWork();
}
/// <summary>
/// 可以根据配置来获取类的实例
/// </summary>
/// <param name="assembleName"></param>
/// <returns></returns>
public StrategyJob GetAssemblyNameFromConfig()
{
try
{
string assembleName = ConfigurationManager.AppSettings["InvokeMethod"];
StrategyJob strategryJob;
strategryJob = (StrategyJob)Assembly.Load("RunJob").CreateInstance(assembleName);
return strategryJob;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
动态性的选取。
最后调用的时候
Context u = new Context();
StrategyJob s = u.GetAssemblyNameFromConfig();
// s.DoWork();
u.SetWorkStrategy(s);
u.DoWork();
共同学习,共同进步!

浙公网安备 33010602011771号