C#实现策略模式

 更新时间:2022年07月11日 09:24:46   作者:奋斗的大橙子  
这篇文章介绍了C#实现策略模式的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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

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#实现策略模式的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • unity 实现摄像机绕某点旋转一周

    unity 实现摄像机绕某点旋转一周

    这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#中Linq的入门教程

    C#中Linq的入门教程

    这篇文章介绍了C#中Linq的基础操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 使用C#实现数据结构堆的代码

    使用C#实现数据结构堆的代码

    这篇文章主要介绍了使用C#实现数据结构堆,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C#连接加密的Sqlite数据库的方法

    C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧
    2017-08-08
  • C#动态生成DropDownList执行失败原因分析

    C#动态生成DropDownList执行失败原因分析

    这篇文章主要介绍了C#动态生成DropDownList执行失败原因分析,以一个实例形式分析了C#动态生成DropDownList的相关注意要点与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#中C/S端实现WebService服务

    C#中C/S端实现WebService服务

    本文主要介绍了C#中C/S端实现WebService服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#实现图片上传(PC端和APP)保存及 跨域上传说明

    C#实现图片上传(PC端和APP)保存及 跨域上传说明

    这篇文章主要介绍了C#实现图片上传(PC端和APP)保存及 跨域上传说明的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • C#如何动态创建lambda表达式

    C#如何动态创建lambda表达式

    这篇文章主要介绍了C#如何动态创建lambda表达式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C#编写的艺术字类实例代码

    C#编写的艺术字类实例代码

    本文给大家分享使用纯C#编写的艺术字类实例代码,代码简单易懂,需要的朋友参考下本教程
    2016-03-03
  • C#实现销售管理系统

    C#实现销售管理系统

    这篇文章主要为大家详细介绍了C#实现销售管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论

?


http://www.vxiaotou.com