首页 > 编程语言 >【C#】策略模式

【C#】策略模式

时间:2023-06-01 18:34:51浏览次数:25  
标签:封装 策略 C# 模式 st 算法 Context Strategy public

1.UML

针对同一个算法/业务有不同的实现,在不同情况下使用不同的实现。
image

//定义算法接口
class abstract Strategy
{
	public abstract void Algorithm();
}

//封装算法实现1
class ConcreteStrategy1:Strategy
{
	public override void Algorithm(){}
}

//封装算法实现2
class ConcreteStrategy2:Strategy
{
	public override void Algorithm(){}
}

//封装算法实现3
class ConcreteStrategy3:Strategy
{
	public override void Algorithm(){}
}


class Context
{
	private Strategy st;	//封装算法对象
	
	public Context(Strategy _st)
	{
		st = _st;
	}
	
	public void DoAlgorithm()
	{
		st.Algorithm();
	}
}
Context ct = new Context(new ConcreteStrategy2());	//具体执行的算法由传入Context构造的类实例决定

ct.DoAlgorithm();	//算法的执行统一为DoAlgorithm()

和简单工厂的对比:

image

简单工厂,重点在将switch判断new不同具体类的过程封装。依赖所有具体类。客户端中获取实例。

策略模式,重点在将算法类/业务类的实例封装,通过方法调用,对外暴露一个统一的调用算法的接口,客户端通过调用这个接口调用算法,屏蔽调用不同算法时调用不同接口。
调用不同算法时,将不同的算法类的实例传入Context的构造函数。

2. 策略模式和简单工厂结合

策略模式,将决定使用什么算法的判断switch放在了客户端中,由客户端通过传入什么算法类的实例决定使用什么算法。增加了客户端和各种算法类的耦合,当增加算法实现时客户端的switch将会增加。
利用简单工厂的思想,将判断使用什么具体算法类的过程封装在Context类中。不再向Context的构造传入不同实例,而是传入switch的case,在构造中创建具体算法类的实例。

class Context
{
	private Strategy st;	//封装算法对象
	
	public Context(string _case)
	{
		switch _case
		{
			case "1":
				st = new ConcreteStrategy1();
			case "2":
				st = new ConcreteStrategy2();
			case "3":
				st = new ConcreteStrategy3();
		}
	}
	
	public void DoAlgorithm()
	{
		st.Algorithm();
	}
}
Context ct = new Context("2");

ct.DoAlgorithm();	//客户端使用算法还是使用统一的接口

好处:客户端彻底与具体的算法类解耦,连与抽象算法类Strategy都解耦了(Strategy对象封装在了Context中)。
但是,策略模式和简单工厂的结合,增加算法/业务实现时,还是要修改Context类。

标签:封装,策略,C#,模式,st,算法,Context,Strategy,public
From: https://www.cnblogs.com/wk2522466153/p/17449744.html

相关文章

  • Spring Cloud开发实践(七): 集成Consul配置中心
    目录SpringCloud开发实践(一):简介和根模块SpringCloud开发实践(二):Eureka服务和接口定义SpringCloud开发实践(三):接口实现和下游调用SpringCloud开发实践(四):Docker部署SpringCloud开发实践(五):Consul-服务注册的另一个选择SpringCloud开发实践(六):基......
  • C#进行word模板占位符替换的几种工具
    word模板中,包含一些需要替换的项,比如{{姓名}}{{年龄}}或者$姓名$$年龄$,从数据库获取信息后,对模板进行替换操作生成新的word文档。简单对以下四种工具做了一下测试:1.NPOI:是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目NPOI操作word的功能很强大,但是读取占位符时,有一......
  • Collection集合:集合进阶概述
         ......
  • 常用的Java Enum JdbcType
    常用的JavaEnumJdbcTypeARRAYBIGINTBINARYBITBLOBBOOLEANCHARCLOBCURSORDATEDECIMALDOUBLEFLOATINTEGERLONGVARBINARYLONGVARCHARNCHARNCLOBNULLNUMERICNVARCHAROTHERREALSMALLINTSTRUCTTIMETIMESTAMPTINYINTUNDEFINEDVARBINARYVARCHAR参考资料......
  • SMU Spring 2023 Trial Contest Round 11
    A.TheTextSplitting题意:给出字符串长度,给出p和q两种切割方式,任选其中一种,把字符串分割输出结果。 题解:先进行判断,p和q是否能整个的分割n,利用p和q的函数关系判断(见代码),再计算有几个p几个q,再进行输出即可voidsolve(){cin>>n>>p>>q;cin>>s;if(p>......
  • 手把手教你Spring Cloud Alibaba教程:使用Nacos作为配置中心
    我们在上面:手把手教你SpringCloudAlibaba教程:nacos安装手把手教你SpringCloudAlibaba教程:使用nacos实现服务注册与发现了解了nacos和springCloudAlibaba的部署和使用,现在我们来了解下nacos作为配置中心应该如何使用。Nacos除了实现了服务的注册发现之外,还将配置中心功能整合......
  • Java多线程三(线程池执行完后再执行主线程)CountDownLatch
      我们在开发多线程的时候,有两种情况一种是我们处理好后,不用管结果。比如我需要查询某些数据然后存在数据库里。还有一种就是查询好数据(通过线程池),然后导出数据。这个就比较麻烦。因为我们要将数据通过多线程处理后,返回一个统一的结果。(由于多线程是在不同的时候执行数据),假如执......
  • 树莓派opencv的安装
    树莓派安装opencv的教程层出不穷,但是能用的很少。我这个教程是亲自安装成功的。我之前安装过好几次opencv2.49都失败了,唯独这个opencv3.1成功了。下面开始安装吧1.准备sudoapt-getinstallbuild-essentialgitcmakepkg-configsudoapt-getinstallcmakegitlibgtk2.0-......
  • ERROR: Kernel configuration is invalid.
    最简单的linuxhello的驱动源程序//下面是驱动源代码#include<linux/init.h>#include<linux/module.h>staticinthello_init(void){printk(KERN_ALERT"Hello,TekkamanNinja!\n");return0;}staticvoidhello_exit(void){......
  • C语言数组
    数组概念在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。从内存角度,是一片连续的内存空间数组初始化://在编译时明确指定......