我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#实现策略模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#实现策略模式

场景:有一个喜欢吃饺子,他有三种不同的方式去吃,蒸饺子,煮饺子,煎饺子,想要用策略模式来设计这个场景,怎么弄?

1.复习简单工厂模式

具体的代码:

EatMethod.cs

public class EatMethod
{
   public virtual void Eat()
   {
      Console.WriteLine("This is the base class!");
   }
}

Steamed.cs

class Steamed : EatMethod
{
   public override void Eat()
   {
       Console.WriteLine("This is steamed dumplings!");
   }
}

Boiled.cs

class Boiled : EatMethod
{
   public override void Eat()
   {
     Console.WriteLine("This is boiled dumplings!");
   }
}

Fried.cs

class Boiled : EatMethod
{
   public override void Eat()
   {
     Console.WriteLine("This is boiled dumplings!");
   }
}

EatFactory.cs

public static class EatFactory
{
   public static EatMethod CreateEatMethod(string eatMethod)
   {
       EatMethod eat = null;
       switch (eatMethod)
       {
          case "Steamed":
               eat = new Steamed();
               break;
          case "Boiled":
               eat = new Boiled();
               break;
          case "Fried":
               eat = new Fried();
               break;
          default:
               break;
            }
        return eat;
    }
}

Program.cs

class Program
{
    static void Main(string[] args)
    {
        EatMethod eat = EatFactory.CreateEatMethod("Steamed");
        eat.Eat();
        eat = EatFactory.CreateEatMethod("Boiled");
        eat.Eat();
        eat = EatFactory.CreateEatMethod("Fried");
        eat.Eat();
    }
}

测试结果:

2.策略模式来设计

上面虽然用简单工厂实现了,但是感觉各种吃饺子的方式,用工厂来创建还是显得比较生硬,每一种吃法应该看成是一种算法,最终的目的都是吃掉,所以这里就引出了策略模式的概念了。

策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

这个模式涉及到三个角色:

环境(Context)角色:持有一个Strategy类的引用。抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

看了UML图感觉和简单工厂也没啥区别啊,不过是把Factory变成了Context而已,但是还是有些不同的,详见//www.jb51.net/article/254877.htm

这里和上面的简单工厂只有EatContext和客户端不一样

EatContext.cs

public class EatContext  
 {
      private EatMethod _eat;

      public EatContext(EatMethod eat)
      {
          _eat = eat;
      }

      public void Eat()
      {
         _eat.Eat();
      }
 }

Program.cs

EatContext ec = new EatContext(new Steamed());
ec.Eat();
ec = new EatContext(new Boiled());
ec.Eat();
ec = new EatContext(new Fried());
ec.Eat();

测试执行结果:

3.对比策略模式和简单工厂模式

我的理解是这样的:

首先是简单工厂模式:

客户端去调用工厂中的CreateEatMenthod方法,从输入上看,是一个字符串,指明了我想要的对象,然后工厂方法,就返回了一个我想要的对象,后面的具体的Eat(),是在客户端使用返回的对象进行调用的。

然后是策略模式:

客户端实例化一个EatContext对象,传入的参数是一个具体的怎么做饺子的对象,然后EatContext根据传入的对象,来初始化一个EatContext对象,后续的客户端操作通过的是EatContext的实例对象来完成的。

上面也能看出来,简单工厂用于创建对象,而策略模式更在乎控制行为,所以前者是创建型模式,后者是行为型模式。

实际应用中,可以将两者在进一步结合,再修改一下程序

EatFactoryContext.cs

public class EatFactoryContext
{
    EatMethod _eat = null;
    public EatFactoryContext(string eatMethod)
    {
        switch (eatMethod)
        {
            case "Steamed":
                _eat = new Steamed();
                break;
            case "Boiled":
                _eat = new Boiled();
                break;
            case "Fried":
                _eat = new Fried();
                break;
            default:
                break;
            }
        }

   public void Eat()
   {
      _eat.Eat();
   }
}

Program.cs

#region 结合
EatFactoryContext efc = new EatFactoryContext("Steamed");
efc.Eat();
efc = new EatFactoryContext("Boiled");
efc.Eat();
efc = new EatFactoryContext("Fried");
efc.Eat();
#endregion

测试结果:

4.总结

经过学习呢,发现是能够把简单工厂和策略模式进行基本的了解,但是如果工作中没有实际遇到,的确对于两者的区别的理解感到困惑,可能很多人和我一样,都是看到UML图发现,两者好像没有什么差别,可能理解还不深入吧,写得可能有些地方还不是很正确,希望看到的高手能指点一二。

到此这篇关于C#实现策略模式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#实现策略模式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++中的策略模式怎么实现

本文小编为大家详细介绍“C++中的策略模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中的策略模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。策略模式主要解决在有多种算法相似的情况下,
2023-07-05

java策略模式如何实现

本篇内容介绍了“java策略模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个
2023-06-19

Java策略模式怎么实现

这篇文章主要介绍“Java策略模式怎么实现”,在日常操作中,相信很多人在Java策略模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java策略模式怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-02

Java中如何实现策略模式

这篇文章给大家分享的是有关Java中如何实现策略模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这里设计了一个有关足球的场景,在进攻当中暂分为传球和射门两个动作。最开始你可能会这样想,设计一个抽象类(Attac
2023-06-17

Android中怎么实现策略模式

Android中怎么实现策略模式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。策略模式一个功能的效果,有不同的算法与策略,根据不同的选择选择不同的结果。简单来说,只要你写过
2023-05-30

java设计模式之策略模式怎么实现

这篇文章主要介绍了java设计模式之策略模式怎么实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。策略模式:策略模式是一种定义一系列算法的方法,算法完成的工作都是相同的工作,
2023-05-31

C++中的策略模式浅析

策略模式属于C++设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。本文将通过示例详细讲解这一模式,需要的可以参考一下
2023-02-27

java策略设计模式怎么实现

在Java中实现策略设计模式,可以按照如下步骤进行:1. 定义一个策略接口(或者抽象类),该接口包含多个具体策略类共同的方法。2. 创建具体的策略类,实现策略接口,并重写接口中的方法。每个具体策略类代表一个具体的策略实现。3. 在使用策略的
2023-08-31

如何使用Spring实现策略模式

本篇内容介绍了“如何使用Spring实现策略模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spring 中 @Autowired注解,大
2023-06-27

javascript设计模式中的策略模式怎么实现

这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!一. 认识策略模式策略
2023-06-26

Java设计模式中的策略模式如何实现

这篇文章主要介绍了Java设计模式中的策略模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式中的策略模式如何实现文章都会有所收获,下面我们一起来看看吧。1 概述在平时开发中,往往会遇到这
2023-06-30

C#策略模式的示例分析

小编给大家分享一下C#策略模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!策略模式所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录