C#实现策略模式
作者:奋斗的大橙子 发布时间:2022-02-09 17:19:01
场景:有一个喜欢吃饺子,他有三种不同的方式去吃,蒸饺子,煮饺子,煎饺子,想要用策略模式来设计这个场景,怎么弄?
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图发现,两者好像没有什么差别,可能理解还不深入吧,写得可能有些地方还不是很正确,希望看到的高手能指点一二。
来源:https://www.cnblogs.com/dcz2015/p/5264953.html


猜你喜欢
- 介绍1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙。由蓝牙技术联盟(Bluetooth SI
- Java java.lang.ExceptionInInitializerError 错误如何解决引起 Java.lang.Ex
- 在maven的pom.xml里面添加一下依赖:<properties><project.build.sourceEncod
- Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的。Java
- 快捷键辅助类 class HotKey { /// <summary> /// 如果函数执行成功,返回值不为0。 /// 如果函
- 在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,这
- 前言Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。Groovy 有着简洁的
- 1、实体类package com.yl.bean;import java.io.Serializable;import java.util.
- 本文实例讲述了Android自定义ViewPager的方法。分享给大家供大家参考,具体如下:package com.rong.activit
- 题目描述原题链接 :88. 合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m
- 写在前面很久以前就听nice0e3师傅说打Fastjson可以试试C3P0,当时还不会java(虽然现在也没会多少)也就没有深究。最近调试F
- 下载 Android SDK,官网:www.android.com 我相信很多人跟我一样,进不去。Android Studio 中文官网 w
- 自己整理了 spring boot 结合 Redis 的工具类引入依赖<dependency> <groupI
- 作为java中的一个重要理念,说起面向对象也是老生常谈了。在找资料的时候多是很专业的术语,又或者很多框架的知识点合集,其实大部分人刚看资料的
- 1. 概述在 Spring Security 5.2 中增强了 DSL 的功能:允许使用 Lambda 表达式来配置 HTTP securi
- 前言是否会遇到这样的场景,你向线程池提交了多个任务,你希望这批任务全部完成后能够反向通知你。你可能会使用线程计数的方式,等到计数器累加到提交
- 介绍原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建
- dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编
- 死信队列:没有被及时消费的消息存放的队列,消息没有被及时消费有以下几点原因:1.有消息被拒绝(basic.reject/ basic.nac
- .NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Co