using System;
///
/// 策略模式:
/// 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化.
/// 此模式主要用来将应用中需要变化的部分独立出来,以让系统更具有弹性
/// 重心不在算法的实现
/// 策略模式的核心在于将易于变化的部分独立出来进行封装,例如:商家在不同节假日会有各种各样的优惠促销活动,
/// 那么订单里的计价模块就适合做成一个策略。
/// 在策略模式里,哪怕算法只有一个实现也是有意义的,将应用和算法实现解耦,增加系统的可扩展性
///
/// 下例:
/// OrderService和ProductService都需要写日志,但它们写入位置不同,OrderService要写入文件,而ProductService要写入DB
/// 直接在各自类中独自实现不利于代码的复用,也不利于维护(假如要再添加个ListService也要写入文件或者要添加个新的日志方式:要写入MessageQueue)
/// 你也可以在Service类中添加一个Setter方法,实现在运行时的动态改变
///
namespace fofo.DesignPattern.Strategy
{
#region Service
public abstract class Service
{
// 这是一个策略,将logger的实现独立于Service
protected ILogger _logger = null;
protected void Initialize()
{
// init
}
public abstract void Invoke(object args);
protected void WriteLog(string message)
{
_logger.WriteLog(message);
}
//other code
}
public class OrderService : Service
{
public OrderService()
{
_logger = new FileLogger();
}
public override void Invoke(object args)
{
WriteLog("begin...");
// do work
WriteLog("end...");
}
}
public class ProductService : Service
{
public ProductService()
{
_logger = new DBLogger();
}
public override void Invoke(object args)
{
WriteLog("begin...");
// do work
WriteLog("end...");
}
}
#endregion
#region Logger
// 抽象策略角色,它们可以互相替换
public interface ILogger
{
void WriteLog(string message);
}
// 具体策略角色
public class FileLogger : ILogger
{
public void WriteLog(string message)
{
// write log to file
}
void ILogger.WriteLog(string message)
{
this.WriteLog(message);
}
// other code
}
// 具体策略角色
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
// write log to db
}
void ILogger.WriteLog(string message)
{
this.WriteLog(message);
}
// other code
}
#endregion
}