概要:干同一件事情,但是根据不同情况有不同做法,我们可以从中提炼出一个动作的抽象,然后用不同的类去实现它,可以随时替换。那样使用这个动作抽象的具体业务就不需要关心他如何实现。设计模式Github源码
我们拿不同时期下单优惠策略不同来讲述策略模式的用法。
IStrategy:策略的抽象接口,定义出行为的抽象
Strategy:具体策略,继承IStrategy,负责实现,Strategy可以有很多个,全部都继承IStrategy。
ActivitiesContext:策略上下文,这个用来控制什么时候用什么策略实现的,当然如果用依赖注入可以不需要这个,在注入时候决定注入哪个方法,策略上下文是负责调度的。
引用关系:
Strategy : IStrategy
ActivitiesContext : IStrategy
看最后面的代码,策略模式的很普通用法,但有时候满足不了我们需求,我们需要把依赖注入结合进去,在代码里随时控制具体实现使用哪个类
image.png如何实现同一个接口可以动态调用不同实例
https://www.jianshu.com/p/b25fb6159290
using System;
namespace Strategy
{
/// <summary>
/// 策略接口
/// </summary>
public interface IActivitiesStrategy
{
/// <summary>
/// 获取则扣策略
/// </summary>
/// <returns></returns>
double GetDiscountStrategy();
}
/// <summary>
/// 策略上下文
/// </summary>
public class ActivitiesContext
{
private readonly IActivitiesStrategy _activitiesStrategy;
public ActivitiesContext(IActivitiesStrategy activitiesStrategy)
{
_activitiesStrategy = activitiesStrategy;
}
public double GetActivitiesDiscount()
{
return _activitiesStrategy.GetDiscountStrategy();
}
}
public class Activities
{
/// <summary>
/// 折扣
/// </summary>
public double Discount { get; set; }
}
public class DoubleElevenActivities : IActivitiesStrategy
{
public double GetDiscountStrategy()
{
return 0.11;
}
}
public class DoubleTwelveActivities : IActivitiesStrategy
{
public double GetDiscountStrategy()
{
return 0.12;
}
}
class Program
{
static void Main(string[] args)
{
ActivitiesContext context = new ActivitiesContext(new DoubleElevenActivities());
Console.WriteLine("Hello World!");
}
}
}
网友评论