C#实现策略模式

作者:奋斗的大橙子 时间:2022-02-09 17:19:01 

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

1.复习简单工厂模式

C#实现策略模式

具体的代码:

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();
   }
}

测试结果:

C#实现策略模式

2.策略模式来设计

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

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

C#实现策略模式

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

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

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

C#实现策略模式

这里和上面的简单工厂只有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();

测试执行结果:

C#实现策略模式

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

我的理解是这样的:

首先是简单工厂模式:

C#实现策略模式

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

然后是策略模式:

C#实现策略模式

客户端实例化一个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

测试结果:

C#实现策略模式

4.总结

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

来源:https://www.cnblogs.com/dcz2015/p/5264953.html

标签:C#,策略,模式
0
投稿

猜你喜欢

  • Android中使用CircleImageView和Cardview制作圆形头像的方法

    2022-04-19 05:41:35
  • Android AlertDialog的几种用法详解

    2023-12-02 18:15:50
  • Android获取设备传感器的方法

    2022-10-07 10:50:16
  • Java编程实现打印螺旋矩阵实例代码

    2021-10-16 19:15:14
  • Android开发中Button组件的使用

    2021-07-08 07:18:13
  • C#实现为类和函数代码自动添加版权注释信息的方法

    2021-11-30 10:05:21
  • Java 如何实现一个http服务器

    2022-03-27 05:40:04
  • SpringBoot登录判断过程代码实例

    2022-09-02 13:15:13
  • Unity实现切割图集工具

    2021-07-03 23:14:57
  • Android实现简单水波纹效果

    2021-11-09 12:40:45
  • Java输入输出流的使用详细介绍

    2023-08-01 22:21:22
  • Android 给控件添加边框阴影效果

    2021-08-13 17:12:07
  • Javaweb El表达式实例详解

    2021-06-21 22:59:32
  • Android实现读取NFC卡卡号示例

    2021-08-06 21:08:39
  • Java在制作jar包时引用第三方jar包的方法

    2023-02-18 23:25:10
  • Android EasyPlayer声音自动停止、恢复,一键静音等功能

    2023-01-12 21:16:48
  • Java比较问题详细分析

    2023-11-20 14:30:48
  • android图像绘制(四)自定义一个SurfaceView控件

    2022-09-27 11:28:07
  • Android 区别真机和模拟器的几种方法

    2022-05-19 14:13:44
  • SpringMVC文件上传中要解决的问题大汇总

    2023-09-02 06:09:20
  • asp之家 软件编程 m.aspxhome.com