行为型模式-策略模式(一)

        今天就说一说设计模式中的策略模式,从名字来讲,意思就是,对应不同的情况,就有一种解决问题的办法,不同的情况,就有不同的应对方法,这就是策略模式,非常的智能化。

也可以参考菜鸟

策略模式 | 菜鸟教程

1.下面我们看一组经常会写到的代码

尤其在业务场景非常复杂的逻辑中,经常出现大量的if语句,包括switch语句,不过switch稍微比if语句好点。

namespace StrategyPatternDemo
{internal class Program{static void Main(string[] args){string a = Console.ReadLine().ToString();if (a == "a"){a = "A";//业务}else if (a == "b"){a = "B";//业务}else if (a == "c"){a = "C";//业务}else if (a == "d"){a = "D";//业务}else if (a == "e"){a = "E";//业务}else if (a == string.Empty){a = "空";//业务}Console.WriteLine(a);Console.ReadKey();}}
}

该代码要实现的业务就是,输入小写字母,然后输出大写字母,再处理一些业务员需求,当然也可以ToUpper方法,就可以了,我们不做讨论,主要是要采用策略模式来设计一下(当然这个也算是过度设计了)。代码简洁、有效、实现功能才是最好的代码。

2.接下来,我们使用策略模式

TypeSelect类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace StrategyPatternDemo
{/// <summary>/// 业务类型,后面继续加/// </summary>public enum TypeSelect{A = 1,B = 2,C = 3,D = 4,E = 5,Empty = 6,}
}

2.StrategyPatternDemo类,定义公共接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace StrategyPatternDemo
{/// <summary>/// 定义一个公开的接口/// </summary>public interface IStrategy{void Execute(string str);}
}

3.StrategyPatternDemo类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace StrategyPatternDemo
{/// <summary>/// 增加实例/// </summary>/// <typeparam name="T"></typeparam>public class InstanceFactory<T> where T : class{private static Dictionary<TypeSelect, T> dicCommands = new Dictionary<TypeSelect, T>();public T CreateInstanceByEnumName(TypeSelect taskType){foreach (TypeSelect cd in Enum.GetValues(typeof(TypeSelect))){if (!dicCommands.Keys.Contains(cd)){//此处获取业务类的种类,可以使用其他方法T baseCommand = Assembly.Load(typeof(T).Assembly.GetName().Name).CreateInstance((typeof(T).Namespace + ".Business.StrategyBusiness" + cd)) as T;if (baseCommand != null){dicCommands.Add(cd, baseCommand);}}}return dicCommands.FirstOrDefault(c => c.Key == taskType).Value;}}
}

4.StrategyPatternDemo类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace StrategyPatternDemo
{/// <summary>/// 一般写法/// </summary>internal class Context{private IStrategy _strategy;public Context(IStrategy strategy){_strategy = strategy;}public void ExecuteStrategy(string str){_strategy?.Execute(str);}}
}

5.业务类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace StrategyPatternDemo.Business
{internal class StrategyBusinessA   : IStrategy{public void Execute(string s){Console.WriteLine(s);//其他业务}}
}

6.调用

可见,调用只需要一句话

using StrategyPatternDemo.Business;namespace StrategyPatternDemo
{internal class Program{static void Main(string[] args){//string a = Console.ReadLine().ToString();//if (a == "a")//{//    a = "A";//    //业务//}//else if (a == "b")//{//    a = "B";//    //业务//}//else if (a == "c")//{//    a = "C";//    //业务//}//else if (a == "d")//{//    a = "D";//    //业务//}//else if (a == "e")//{//    a = "E";//    //业务//}//else if (a == string.Empty)//{//    a = "空";//    //业务//}//Console.WriteLine(a);//Console.ReadKey();int a = Convert.ToInt32(Console.ReadLine());var str = (TypeSelect)a;   //转化类型new Context(new  InstanceFactory<IStrategy>().CreateInstanceByEnumName(str)).ExecuteStrategy(str.ToString());  //调用Console.ReadKey();}}
}

7.效果

8.增加F

只需要增加2处,其他地方不变

效果

9.文件总览 

        此文,只是为了策略模式而策略模式,设计模式在日常的开发代码中,很少使用,比如以上案例,使用设计模式,就太复杂了, 根本没必要使用。但是在用到的时候,将会非常的给力,大部分都是后期业务堆起来后,才会体现出设计模式优点,当然使用了设计模式,也有缺点,一切的一切,都按照当下的业务量来衡量,是否有必要使用设计模式。

其中ConsoleApp1是另一种方式实现,效果一样

源码:

https://download.csdn.net/download/u012563853/87993185

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/12957.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器扩容记录

先在控制台选择云盘扩容&#xff0c;然后才能在服务器操作&#xff1a; blkidlsblk -n df -Thapt-get updatetype growpart || apt-get install -y cloud-guest-utilstype sgdisk || apt-get install -y gdiskLC_ALLen_US.UTF-8 growpart /dev/vda 3 resize2fs /dev/vda3

svn下载及使用

下载 链接&#xff1a;https://pan.baidu.com/s/1RV6vAujA1anHhXJuKbItUQ?pwdflzx 提取码&#xff1a;flzx 这是svn安装包以及中文安装包&#xff0c;放在百度网盘了&#xff0c;有需要可以下载 注意&#xff1a;svn中文语言包安装的版本需要和svn的版本一致 他有两种安装…

计算机视觉 3D点云极简概述

一、概述 点云是表示 3D 坐标系中的数字 3D 物理对象或空间的点数据库。它由数百万或者更多个单独的测量点组成,具有 x、y 和 z 坐标。3D点云是物体的高精度数字记录。点云用于生成用于 3D 建模的 3D 网格和其他模型。包括医学成像、3D 打印、制造、建筑、3D 游戏和虚拟现实 (…

RAID5重建失败的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器&#xff0c;4块SAS磁盘组建了一组RAID5磁盘阵列。服务器安装的windows server操作系统&#xff0c;上面运行了一个Oracle单节点&#xff0c;数据存储为文件系统&#xff0c;无归档。该oracle数据库的数据量不大&#xff0c…

UG NX二次开发(C#)-建模-根据特征获取体(或者关联体)

文章目录 1、前言2、创建块特征与UIStyler2.1 创建两个长方体2.2 创建一个UIStyler3、添加获取体的代码1、前言 UG NX的建模是基于特征建模的,比如块、圆柱体、合并操作等等都是特征,都有特征对象,对于具有体的特征,其可以通过NXOpen二次开发技术实现二者的转换,也可以通…

网络编程套接字

目录 网络编程基础 为什么需要网络编程&#xff1f; 什么是网络编程 网络编程中的基本概念 发送端和接收端 请求和响应 客户端和服务端 常见的客户端服务端模型 Socket套接字 概念 分类 Java数据报套接字通信模型 Java流套接字通信模型 Socket编程注意事项 UDP数…

List移除元素的四种方式

List 移除某个元素 四种方式&#xff1a; 方式一&#xff0c;使用 Iterator &#xff0c;顺序向下&#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式二&#xff0c;倒序遍历 List &#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式…

括号生成(力扣)递归 JAVA

目录 题目描述&#xff1a;纯递归解法&#xff1a;递归 回溯&#xff1a; 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a…

spring重点标签有哪些

<bean>标签 id属性:在容器中Bean实例的唯一标识&#xff0c;不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围&#xff0c;常用是singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属…

Netty核心技术九--TCP 粘包和拆包及解决方案

1. TCP 粘包和拆包基本介绍 **TCP是面向连接的&#xff0c;面向流的&#xff0c;提供高可靠性服务。收发两端&#xff08;客户端和服务器端&#xff09;都要有一一成对的socket&#xff0c;因此&#xff0c;发送端为了将多个发给接收端的包&#xff0c;更有效的发给对方&#x…

爆肝整理,Docker容器测试-常见问题+解决(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题1&#xff1a…

React + TypeScript 实践

主要内容包括准备知识、如何引入 React、函数式组件的声明方式、Hooks、useRef<T>、useEffect、useMemo<T> / useCallback<T>、自定义 Hooks、默认属性 defaultProps、Types or Interfaces、获取未导出的 Type、Props、常用 Props ts 类型、常用 React 属性类…