C#设计模式之策略模式

策略模式简介

策略模式在设计模式中属于对象行为型模式,它的意图是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。

策略模式的图解如下所示:

示例

本文通过一个简单的例子来向大家介绍C#如何使用策略模式。本文以出行这个行为举例,出行我们可以使用多种方式,比如自己开车、乘坐公交、骑自行车等。

1、定义策略接口

csharp 复制代码
public interface ITravelStrategy
 {
     public void Print();
 }

我们定义了一个出行策略接口,只定义了一个Print方法。

2、实现具体策略类

arduino 复制代码
 public class Car : ITravelStrategy
 {
     public void Print()
     {
         Console.WriteLine("乘坐汽车出行\r\n");
     }
 }
 public class Bike : ITravelStrategy
 {
     public void Print()
     {
         Console.WriteLine("骑自行车出行\r\n");
     }
 }
 public class Bus : ITravelStrategy
 {
     public void Print()
     {
         Console.WriteLine("乘坐公交出行\r\n");
     }
 }

定义了三个具体策略类分别为Car、Bike与Bus,都实现了ITravelStrategy接口,它们的实现是不同的。

3、实现上下文类

csharp 复制代码
 public class TravelContext
 {
     private ITravelStrategy _strategy;
​
     public TravelContext(ITravelStrategy strategy)
     {
         _strategy = strategy;
     }
​
     public void SetStrategy(ITravelStrategy strategy)
     {
         _strategy = strategy;
     }
​
     public void ExecuteStrategy()
     {
         _strategy.Print();
     }
 }

该上下文类维护一个对ITravelStrategy对象的引用,可以在构造函数中为其指定一个具体的策略类,它还提供了SetStrategy方法来改变策略,ExecuteStrategy方法来执行策略。

4、使用策略模式

scss 复制代码
static void Main()
{
    // 创建上下文并设置初始策略
    TravelContext travelContext = new TravelContext(new Car());
​
    travelContext.ExecuteStrategy();
​
    // 切换策略为坐公交出行
    travelContext.SetStrategy(new Bus());
​
    travelContext.ExecuteStrategy();
​
    // 切换策略为骑自行车出行
    travelContext.SetStrategy(new Bike());
​
    travelContext.ExecuteStrategy();
  
    Console.ReadLine();
}

运行结果:

该示例的图解如下所示:

总结

使用策略模式的步骤总结如下:

希望对你有所帮助。

Ref

1、《Head First 设计模式(中文版)》

2、《大话设计模式》

3、《设计模式:可复用面向对象软件的基础》

4、YouTube Strategy Pattern - Design Patterns in C#

相关推荐
宝桥南山5 小时前
GitHub Models - 尝试一下使用GitHub Models
microsoft·ai·微软·c#·github·.netcore
hixiong1238 小时前
C# OpenvinoSharp部署INSID3
开发语言·人工智能·ai·c#·openvinosharp
星辰徐哥9 小时前
Unity C#入门:变量的定义与访问权限(public/private)
unity·c#·lucene
leoufung9 小时前
LeetCode 30:Substring with Concatenation of All Words 题解(含 C 语言 uthash 实现)
c语言·leetcode·c#
hacker7079 小时前
Visual Studio安装教程(C#开发版)
ide·c#·visual studio
SKY -dada9 小时前
Understand 使用教程
开发语言·c#·流程图·软件构建·敏捷流程·代码复审·源代码管理
William_cl12 小时前
【C#/.NET 进阶】ASP.NET 架构与最佳实践:DI 依赖注入(IoC 核心)从入门到避坑
c#·asp.net·.net
武藤一雄12 小时前
WPF:MessageBox系统消息框
前端·microsoft·c#·.net·wpf
武藤一雄12 小时前
WPF进阶:万字详解WPF如何性能优化
windows·性能优化·c#·.net·wpf·.netcore·鲁棒性
xiaogutou11211 天前
2026年历史课件PPT模板选购指南:教师备课效率与精度的平衡方案
开发语言·c#