参考来源:
- https://blog.csdn.net/LoveLion/
- https://blog.csdn.net/qq_41470939/
在现代化社会中,出行必须乘坐交通工具,那么根据时间、距离等因素,我们可选择多种交通工具,比如:飞机、轮船、汽车、火车等。
在软件开发中,我们也常常会遇到类似的情况,实现某一个功能有多条途径,每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。本章我们将介绍一种为了适应算法灵活性而产生的设计模式——策略模式。
一 介绍
策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。
二 结构组成
Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。
ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
三 代码实现
源码下载地址:https://download.csdn.net/download/qq_25757495/77988980
示例代码为出行交通工具
3.1 环境类:
public class StrategyModelContext
{
public IMove? _moveMethod;
public StrategyModelContext(MoveType moveType) =>
_moveMethod = moveType switch
{
MoveType.飞机 => new MoveByAirplane(moveType),
MoveType.轮船 => new MoveByShip(moveType),
MoveType.火车 => new MoveByTrain(moveType),
MoveType.汽车 => new MoveByCar(moveType),
_ => _moveMethod
};
public void MoveToPlate() => _moveMethod?.MoveToPlate();
}
3.2 抽象策略类(接口):
public interface IMove
{
public MoveType MoveType { get; set; }
public void MoveToPlate();
}
3.3 具体策略类:
/// <summary>
/// 飞机出行
/// </summary>
public class MoveByAirplane : IMove
{
public MoveByAirplane(MoveType moveType)
{
MoveType = moveType;
}
public MoveType MoveType { get; set; }
public void MoveToPlate()
{
Console.WriteLine($"通过{MoveType}出行!");
}
}
/// <summary>
/// 汽车出行
/// </summary>
public class MoveByCar:IMove
{
public MoveByCar(MoveType moveType)
{
MoveType = moveType;
}
public MoveType MoveType { get; set; }
public void MoveToPlate()
{
Console.WriteLine($"通过{MoveType}出行!");
}
}
/// <summary>
/// 轮船出行
/// </summary>
public class MoveByShip : IMove
{
public MoveByShip(MoveType moveType)
{
MoveType = moveType;
}
public MoveType MoveType { get; set; }
public void MoveToPlate()
{
Console.WriteLine($"通过{MoveType}出行!");
}
}
/// <summary>
/// 火车出行
/// </summary>
public class MoveByTrain : IMove
{
public MoveByTrain(MoveType moveType)
{
MoveType = moveType;
}
public MoveType MoveType { get; set; }
public void MoveToPlate()
{
Console.WriteLine($"通过{MoveType}出行!");
}
}
四 优缺点
4.1 优点:
- 策略类之间可以自由切换,因为所有策略类都实现了的是一个接口
- 扩展更加方便,加入新的算法只需要新增加一个策略类,并且修改策略类算法时不会影响调用方面
- 避免了多重if else语句的出现
4.2 缺点:
- 调用方需要知道所有的策略类,才能自行决定调用哪个策略类