策略设计模式

定义一个类(抽象也可以),抽象类具有代表意义,表示其他类实现这个抽象类。

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();

  

 

 

posted @ 2014-02-17 14:53  chengdu.jack.li  阅读(121)  评论(0)    收藏  举报