【设计模式】GoF设计模式之策略模式(Strategy Pattern)

设计模式之策略模式 Strategy Pattern

V1.0

核心概念

策略模式是一种行为型设计模式,其核心思想是业务类执行某个动作时,可以使用该动作的不同的实现,并在程序运行中可以切换使用该动作的不同的实现。

不同的动作的实现被封装为不同的类,这些具体实现类继承统一的接口,因此业务类可以持有任一动作具体实现,并可以对其进行替换。

角色

  • Strategy(策略接口):定义了动作的统一接口,具体策略需要实现该接口。
  • ConcreteStrategy(具体策略):实现了策略接口,不同的具体策略实现了同一动作的不同实现。
  • Context(上下文):持有具体策略的引用,在业务中执行具体策略,并可以更换不同的具体策略,以使用同一动作的不同的实现方式。

代码示例

csharp 复制代码
/// <summary>
/// 交通方式策略接口,定义了动作的统一接口
/// </summary>
public interface ITransportationMode
{
    public void Travel();
}

/// <summary>
/// 具体策略,乘坐飞机
/// </summary>
public class ConcreteModeAirplane:ITransportationMode
{
    public void Travel()
    {
        Console.WriteLine("Travel by airplane");
    }
}

/// <summary>
/// 具体策略,乘坐火车
/// </summary>
public class ConcreteModeTrain : ITransportationMode
{
    public void Travel()
    {
        Console.WriteLine("Travel by train");
    }
}

/// <summary>
/// 具体策略,乘坐长途汽车
/// </summary>
public class ConcreteModeCoach : ITransportationMode
{
    public void Travel()
    {
        Console.WriteLine("Travel by coach");
    }
}

/// <summary>
/// 上下文类,可以使用不同的出行方式出行
/// </summary>
public class ContextTravelPlan
{
    /// <summary>
    /// 出行方式
    /// </summary>
    public ITransportationMode mean;

    public ContextTravelPlan(ITransportationMode mean)
    {
        this.mean = mean;
    }

    /// <summary>
    /// 更换策略,即出行方式
    /// </summary>
    /// <param name="newMean"></param>
    public void setMean(ITransportationMode newMean)
    {
        this.mean = newMean;
    }

    public void travelTo(string place)
    {
        mean.Travel();
        Console.WriteLine($"Traveled to {place}");
    }
}

public class Program
{
    public static void Main(string[] arg)
    {


        //建立具体策略对象
        ConcreteModeAirplane meanAirplane = new();
        ConcreteModeTrain meanTrain = new();
        ConcreteModeCoach meanCoach = new();

        //建立旅行计划上下文类
        ContextTravelPlan ctp = new(meanAirplane);

        //使用飞机方式出行
        ctp.travelTo("Shanghai");

        //更换策略,使用火车出行方式
        ctp.setMean(meanTrain);

        //使用火车方式出行
        ctp.travelTo("Chongqing");

        //更换策略,使用长途汽车出行方式
        ctp.setMean(meanCoach);

        //使用长途汽车出行
        ctp.travelTo("Jinan");

    }
}

程序运行结果

复制代码
Travel by airplane
Traveled to Shanghai
Travel by train
Traveled to Chongqing
Travel by coach
Traveled to Jinan

代码讲解

  • ITransportationMode接口:策略接口,定义了交通方式的统一接口Travel,具体的交通方式需要实现这个接口。
  • ConcreteModeAirplane类:具体策略,实现了交通方式接口Travel,为乘坐飞机出行,接口实现中输出了乘坐飞机出行的信息。
  • ConcreteModeTrain类:具体策略,实现了交通方式接口Travel,为乘坐火车出行,接口实现中输出了乘坐火车出行的信息。
  • ConcreteModeCoach类:具体策略,实现了交通方式接口Travel,为乘坐长途汽车出行,接口实现中输出了乘坐长途汽车出行的信息。
  • ContextTravelPlan类:上下文类,是具体的业务逻辑,构造时使用具体出行方式对象(具体策略对象)构建,并可以使用setMean方法替换具体出行方式(具体策略)。toTravel方法是上下文类的具体的业务逻辑,其中使用其持有的出行方式mean,出行到指定的地方。
  • Program类:客户端代码,创建了具体出行方式(具体策略),使用飞机出行方式meanAirplane创建了出行上下文类,执行出行动作。更换出行方式,即具体策略,再次进行出行动作,重复2次。

适用范围

  • 当一个动作可能有多种实现,并且需要在不同时间修改使用不同的动作实现时。
  • 将来可能添加新的动作实现的场景,使用策略模式可以不修改现有的代码。
相关推荐
星原望野8 小时前
JAVA:策略模式的实战使用
java·开发语言·策略模式
前端张三9 小时前
从零构建大模型(零)——搭建配置环境
策略模式
j_xxx404_12 小时前
Linux 线程日志系统设计:从策略模式、RAII 到 pthread 线程安全与内核写入路径|附源码
linux·运维·服务器·开发语言·c++·人工智能·策略模式
workflower1 天前
具身智能研究对象:物理交互中的智能行为
设计模式·动态规划·软件工程·软件构建·scrum
折哥的程序人生 · 物流技术专研1 天前
Java 23 种设计模式:从踩坑到精通 | 抽象工厂 —— 支付/收款如何成套创建?跨平台 UI 如何一键换肤?
java·开发语言·后端·设计模式
老码观察2 天前
设计模式实战解读(八):代理模式——控制访问的隐形中间层
设计模式·代理模式
我爱cope2 天前
【Agent智能体12 | 反思设计模式-使用外部反馈】
人工智能·设计模式·语言模型·职场和发展
geovindu2 天前
python: Bounded Parallelism Pattern
开发语言·python·设计模式·有界并行模式
我爱cope2 天前
【Agent智能体11 | 反思设计模式-评估反射的影响的方法】
人工智能·设计模式·语言模型·职场和发展
nnsix2 天前
设计模式 - 迭代器模式 笔记
笔记·设计模式·迭代器模式