您的位置:首页 > 其它

设计模式和原则:策略模式

2013-06-02 14:28 375 查看
[u]设计模式和原则索引[/u]

 

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
}


 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: