重构技巧之策略模式优化业务代码

2023-05-16

重构技巧之策略模式优化业务代码

策略模式对业务代码进行重构背景分析

在日常的开发过程中,我们肯定会遇到很多if else或者switch case的业务代码,作为维护这类代码的开发者来说,分支太长,影响开发者阅读代码的效率,考虑以下代码

void  func()
{
	if(...)
	{
	}
	else if(...){
	}
	else if(...){
		
	}// 以下省略N个else if 分支,N取0到正无穷
}

如果func函数内部还定义了一些局部变量,而且在每个分支中有的使用并修改,有的没有使用,那就呵呵了,妥妥的一股坏代码的味道。
不过可惜,在目前很多公司的很多项目的代码中,这种坏代码肯定数不胜数。

以下介绍设计模式中的策略模式来对业务代码和具体的执行策略进行解耦,这样可以大大简化业务代码维护者的开发过程,提高代码阅读效率进一步提升开发效率。

不多说,直接上代码,重要的解释我已在代码中进行注释解释。

使用策略模式优化业务代码(C++实现)

#include<stdio.h>

template<typename T>
class SingleTon {
private:
	SingleTon();
public:
	static T* GetInstance();
};
enum class StrategyType {
	T1,
	T2,
	T3
};

/*
* 提供策略接口,让不同策略的子类继承该接口来实现不同的策略
*/
class StrategyIntf {
public:
	virtual void executeStrategy() = 0;
};

/*
* 策略一: 我只需要关心我自己的策略是什么即可,不需要外部的任何信息
*/
class Strategy1 : public StrategyIntf {
public:
	// Inherited via StrategyIntf
	virtual void executeStrategy() override
	{
		printf("Strategy1: I use my strategy to do somethings. \n");
	}

};

/*
* 同策略一
*/
class Strategy2 : public StrategyIntf {
public:
	// Inherited via StrategyIntf
	virtual void executeStrategy() override
	{
		printf("Strategy2: I use my strategy to do somethings. \n");
	}

};
class StrategyFactory {
public:
	StrategyIntf* GetStrategy(StrategyType type)
	{
		if (type == StrategyType::T1)
		{
			return SingleTon<Strategy1>::GetInstance();
		}
		else if (type == StrategyType::T2)
		{
			return SingleTon<Strategy2>::GetInstance();
		}

		return nullptr;
	}
};
int main()
{
	
	StrategyType type1 = StrategyType::T1;
	StrategyType type2 = StrategyType::T2;

	StrategyType type = type1;   // 模拟外部程序传进来的参数值

	// BEIGIN 
	// 使用switch的业务代码
	/*
	switch (type)
	{
		case StrategyType::T1:
			// TODO
			break;
		case StrategyType::T2:
			// TODO
			break;
	default:
		break;
	}
	*/
	// END
	// 以上从BEGIN到END的代码作为客户端业务代码,没有将具体的业务策略和客户端代码进行解耦,如果要新增一种策略类型
	// 就必须在客户端代码中新增一个case分支和对应的策略代码

	// 以下提供一种写法,这样即使新增一种策略类型,客户端代码(BEGIN1到END1的代码)也不需要修改,只要新增一个策略子类的实现
	// 并在StrategyFactory的GetStrategy函数中返回这个策略子类即可
	// BEIGIN1
	if (SingleTon<StrategyFactory>::GetInstance()->GetStrategy(type) != nullptr)
	{
		SingleTon<StrategyFactory>::GetInstance()->GetStrategy(type)->executeStrategy();
	}
	// END1
	return 0;
}

template<typename T>
SingleTon<T>::SingleTon()
{
}

template<typename T>
T* SingleTon<T>::GetInstance()
{
	static T instance;
	return &instance;
}

执行结果

Strategy1: I use my strategy to do somethings.

F:\HappyCoding\Project1\x64\Debug\Project1.exe (process 15672) exited with code 0.
Press any key to close this window . . .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重构技巧之策略模式优化业务代码 的相关文章

随机推荐

  • Ubuntu14.10登录界面隐藏其他用户登录窗口

    上次装完MySQL后每次开机登录界面都会有一个mysql用户登录框在管理员用户下边 感觉很碍眼 记得上次在安装MySQL时就屏蔽了mysql用户登录 xff0c 可为何还会在登录界面显示 比较纳闷了 在网上找很多方法都没有用 感觉千篇一律
  • Hadoop64位版本安装后遇到的警告处理

    在使用hadoop的过程中 xff0c 会遇到一个警告 xff0c 内容如下 xff1a WARN util NativeCodeLoader Unable to load native hadoop library for your pl
  • 【MFC基础教程】MFC 中常用类,宏,函数介绍

    一 常用类 CRect xff1a 用来表示矩形的类 xff0c 拥有四个成员变量 xff1a top left bottom right 分别表是左上角和右下角的坐 标 可以通过以下的方法构造 xff1a CRect int l int
  • 从cas-overlay-template安装apereo cas 6.1.x并连接CAS客户端

    一 什么是单点登录 简单点说 单点登录的英文名称为Single Sign On xff0c 简写为SSO xff0c 它是一个用户认证的过程 xff0c 允许用户一次性进行认证之后 xff0c 就访问系统中不同的应用 xff1b 而不需要访
  • linux教程:[4]配置Tomcat开机启动

    我们在linux下安装好tomcat之后 xff1b 经常是需要配置到开机启动的 xff1b 这样的话就不需要我们每次重启linux服务器之后自己在登陆运行startup sh文件启动tomcat了 本次的演示环境是在centos7中完成的
  • 用word2016 写CSDN 博客

    在word2016 中 点击文件 61 gt 共享 61 gt 发布至博客 下面点击 立即注册 在这个里面 选择其他 xff0c xff08 这里我说的是 CSDN 博客 xff09 http write blog csdn net xml
  • 详解cocos2d帧率FPS

    详解cocos2d帧率FPS 最近在使用coco2d js写一个游戏的时候 需要将帧率实时显示出来 于是搜索了一下 获得FPS有下面几个方法 cc director getAnimationInterval cc director getS
  • Eclipse本地运行与远程提交MapReduce程序的步骤详解

    1 下载eclipse插件 此插件只是方便我们在eclipse上查看hdfs集群上的数据而已 1 1 下载对应版本的 hadoop eclipse plugin XXX jar 并将其复制到eclipse下的plugin的目录下 xff0c
  • sagalbot/vue-select 选中元素变动事件(:on-change 踩坑)

    文章目录 场景分析方案 amp amp 遇到的坑源码 场景 需要根据选中元素为依赖获取一个计算属性 array 此时computed不能满足 分析 官方文档的介绍 An optional callback function that is
  • 客户需求VS最终软件交付

    客户起初要求的样子 xff0c 和最终项目交付时的样子 xff0c 非常真实 你永远不知道开发过程中 有哪些或深或浅 xff0c 或近或远的弯弯绕绕在等着你 回复 干货 获取精选干货视频教程 回复 加群 加入疑难问题攻坚交流群 回复 mat
  • mapreduce python编程实例

    mapreduce python编程实例 1 mapreduce使用python WordCount实例 1 1 mapper函数使用 vi mapper py usr bin python coding utf 8 Filename ma
  • Centos7安装KVM虚拟化

    Centos7安装部署KVM 一 配置网桥 1 备份原来的配置文件2 修改配置文件a 修改已连接的网卡配置文件 以ifcfg eno1为例 b 配置网桥配置文件 xff08 以ifcfg br0为例 xff09 c 重启网卡 xff08 建
  • Nanopi M4 基于Opencv 打开USB摄像头

    一 环境选择 首次使用Nanopi M4 ARM板 xff0c 最初加载的是官方给的rk3399 sd friendlydesktop bionic 4 4 arm64 20190523 img xff0c 但我最终放弃使用该系统 xff0
  • “学C语言计划”后续

    从上一篇日记 学C语言计划 到现在已经过去了一个季节了 季节翻页 xff0c 而我菜鸟依旧 xff01 连大自然节奏都跟不上 xff0c 这真是要作死的节奏啊 几天前 xff0c 考完了高数和C语言 xff0c 顺便 玩完 了 后天要考英语
  • 解决KEIL中ARM编译器不能编译的问题

    keil编译器出现问题 xff0c 根据提示意思就是ARM编译器选择不对的问题 Target 39 Printf 39 uses ARM Compiler 39 V5 06 update 6 build 750 39 which is no
  • C++ ZeroMQ 发布订阅模式例子跟注意事项

    发布订阅模式 接收端 xff1a void context void subscriber 第一步 xff1a zmq ctx new 创建context对象 context 61 zmq ctx new 第二步 xff1a 创建socke
  • 目标检测算法——anchor free

    一 anchor free 概述 1 先要知道anchor 是什么 xff08 这需要先了解二阶段如faster rcnn xff0c 一阶检测器如YOLO V2以后或SSD等 xff09 在过去 xff0c 目标检测通常被建模为对候选框的
  • 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)

    概述 首先 xff0c 我们把loss归为两类 xff1a 一类是本篇讲述的基于softmax的 xff0c 一类是基于pair对的 xff08 如对比损失 三元损失等 xff09 基于pair对的 xff0c 参考我的另一篇博客 xff1
  • Oauth2知识总结

    官网 xff1a OAuth Community Site OAuth是一个关于授权 xff08 authorization xff09 的开放网络工业标准 xff0c 允许用户授权第三方应用访问用户存储在其它应用上的信息 xff0c 而不
  • 重构技巧之策略模式优化业务代码

    重构技巧之策略模式优化业务代码 策略模式对业务代码进行重构背景分析 在日常的开发过程中 xff0c 我们肯定会遇到很多if else或者switch case的业务代码 xff0c 作为维护这类代码的开发者来说 xff0c 分支太长 xff