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

设计模式和原则索引

 

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
}


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值