设计模式のStrategyPattern(策略模式)----行为模式

一、问题产生背景

       当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理。这些处理和客户端无关,我们可以把这些算法抽象,然后进行处理。之所以叫策略,基本含义就是

针对一个问题,采用一种处理策略。

二、策略模式的通常做法

     1、将类似的算法分离,并抽象。

     2、客户端选择算法(可以结合简单工厂模型,将矛盾转移到别的类里面)

     3、Context调用算法。(Context是业务处理过程中的全部业务信息)

三、具体实例

我想要实现一个简单的计算器功能,首先我要面对的是+、-、*、/四则运算四个算法,我们可以将它抽象

    public abstract class AbstractCalculation{public void Show(){Console.WriteLine("这里是一个具体的计算");}public abstract int Calculation(int iInputLeft, int iInputRight);}

然后实现各个具体的运算(以+为示例,其它类似)

    public class Plus : AbstractCalculation{public override int Calculation(int iInputLeft, int iInputRight){return iInputLeft + iInputRight;}}

这样我们的抽象工作就完成了。

下面我们写上下文类(Context,包含业务处理的全部信息,变量以及操作)

   public class Context{private int LeftOperator = 0;private int RightOperator = 0;private AbstractCalculation calculation = null;public Context(AbstractCalculation calculation, int iInputLeft, int iInputRight){this.calculation = calculation;LeftOperator = iInputLeft;RightOperator = iInputRight;}public int Calculate(){Console.WriteLine("Start Calculate");try{return calculation.Calculation(LeftOperator, RightOperator);}catch (Exception ex){throw ex;}}}

我们为了简化客户端,采用简单工厂模式将选择的矛盾转义到SimpleFactory中

   public class SimpleFactory{public static AbstractCalculation CreateCalculation(string oper){switch (oper){case "+":return new Plus();case "-":return new Minus();case "*":return new Mutiply();case "/":return new Division();default:throw new Exception("不支持的操作!");}}}

最后进行组合调用:

    class Program{static void Main(string[] args){Console.WriteLine("策略模式Demo");int intResult = 0;int leftOperator;int rightOperator;string oper;while (true){Console.WriteLine("请输入第一个操作数:");leftOperator = Convert.ToInt32( Console.ReadLine());Console.WriteLine("请输入操作符:");oper = Console.ReadLine();Console.WriteLine("请输入第二个操作数:");rightOperator = Convert.ToInt32(Console.ReadLine());AbstractCalculation calculation = SimpleFactory.CreateCalculation(oper);Context context = new Context(calculation, leftOperator, rightOperator);intResult = context.Calculate();Console.WriteLine("{0}{1}{2}={3}",leftOperator,oper,rightOperator,intResult);}}}

四、设计模式分析

优点:a、将与具体业务无关的算法分离,便于添加。通常的,因为面向对象语言的最小单位是类,我们最好是添加算法类,而不是修改算法类。

           b、由于context层将算法分离,因此可以添加一些其他渠道的参数,或者添加特殊处理,或者添加日志等。

缺点:并没有解决需要选择算法的矛盾,因此需要结合其他的设计模式处理,就像本利中添加了一个简单工厂,将矛盾从客户端转移,如果需要进一步处理,可以采用反射+配置文件的方式,或者依赖注入。

代码链接

 

 

      

转载于:https://www.cnblogs.com/xietianjiao/p/8057594.html

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

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

相关文章

linux安装虚拟环境virtualenv

(安装虚拟环境,不然会和其他环境冲突) https://blog.csdn.net/wtwcsdn123/article/details/88653179 https://blog.csdn.net/u011798443/article/details/80881931(超详细) pip install virtualenv 创建python3环境 …

windows系统服务器添加ssl证书

一、为域名申请证书 浏览器打开后系在对应版本: https://keymanager.org/ 注册账号: https://freessl.cn/ 安装刚刚下载的软件; 登录进去就可以申请域名的证书了 二、域名解析 解析完后倒回软件那点击“配置完成,检查一下” …

使用ANTLR在5分钟内用Java解析任何语言:例如Python

我喜欢出于多种目的处理代码,例如静态分析或自动重构。 对我来说,有趣的部分是推理从抽象语法树(AST)构建的模型。 为此,您需要一种从源文件中获取AST的方法。 使用ANTLR和完整的语法集合可在此处轻松完成:…

[转]Global exception handling in Web API 2.1 and NLog

本文转自:https://stackoverflow.com/questions/25865610/global-exception-handling-in-web-api-2-1-and-nlog In Web API 2.1 is new Global Error Handling. I found some example how to log exceptions into Elmah ( elmah sample ). But I use NLog to log er…

linux服务器配置ssl证书

一、申请ssl证书 这里有申请域名的ssl证书的步骤: https://blog.csdn.net/weixin_38797742/article/details/109471250 二、配置服务器 打开项目对应的配置文件,配置图中三行信息,端口、还有申请的证书的所在目录。 listen 443 ssl; ssl_…

将自定义的集合数据使用pagehelper进行分页

PageHelper 是一个用于在 MyBatis 中进行分页查询的插件,它主要设计用于对从数据库查询的结果进行分页。 如果数据不是直接从 MySQL 数据库中查询得到,而是已经存在于内存中的集合(如 List、ArrayList 等),你可以通过以…

视图层的数据绑定

数据绑定WXML 中的动态数据均来自对应 Page 的 data。 只要把data中的数据改变,视图层就会自动改变,无需使用DOM操作。 简单绑定数据绑定使用 Mustache 语法(双大括号)将变量包起来 使用方法: {{ 内容 }} 在组件中使用…

使用dwebsocket在Django中使用Websocket

一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接…

ejb 2.0 3.0_Java EE 6测试第I部分– EJB 3.1可嵌入API

ejb 2.0 3.0我们从Enterprise JavaBeans开发人员那里听到的最常见的请求之一就是需要改进的单元/集成测试支持。 EJB 3.1规范引入了EJB 3.1可嵌入API,用于在Java SE环境中执行EJB组件。 与传统的基于Java EE服务器的执行不同,可嵌入式用法允许客户端代码…

如何添加自动更新Play Framework 2.X项目的版本号

我想拥有要发布新版本时自动更新的版本号,因此我着手了解如何使用Play Framework进行此操作。 我发现我可以将其基于sbt-release插件,但是并不是那么简单。 这是我的策略,因此最后我要做的就是运行“ activator release ”: 1.添…

JS容易犯错的this和作用域

var someuser { name: byvoid, func: function() {console.log(this.name); }}; var foo { name: foobar};someuser.func(); // 输出 byvoidfoo.func someuser.func; foo.func(); // 输出 foobarname global;func someuser.func; func(); // 输出 global在 JavaScript 中,…

【原创】Linux安装Redis

【注】说是原创其实是从各个博客中copy出来的,不过经本人总结,也算是半个原创吧,哈哈... 1.安装环境: 2.安装步骤 2.1 安装目录 cd /usr/local mkdir redis 2.2 下载包 wget http://download.redis.io/releases/redis-3.2.11.tar…

前端:屏蔽F12审查元素,禁止修改页面代码

一、屏蔽F12 审查元素 document.onkeydown function(){if(window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode0;event.returnValuefalse; } if(window.event && window.event.keyCode 13) {window.event.keyCode 50…

SDN第四次作业

ryu控制器 ryu架构清晰,支持OpenFlow全部版本,采用Python语言进行APP开发。其上层为OpenStack和Web提供了编程接口,中间为Ryu自行研发的应用组件,最下层为Ryu底层实现的基本组件。 onos控制器 onos是面向运营商网络的SDN操作系统,采用java语言…

resteasy_RESTEasy教程第2部分:Spring集成

resteasyRESTEasy提供了对Spring集成的支持&#xff0c;这使我们能够将Spring bean作为RESTful WebServices公开。 步骤&#xff03;1&#xff1a;使用Maven配置RESTEasy Spring依赖项。 <project xmlnshttp:maven.apache.orgPOM4.0.0 xmlns:xsihttp:www.w3.org2001XMLSche…

前端代码加密

虽然浏览器会把加密的代码破解在解析&#xff0c;但是还是可以稍微加密&#xff0c;或者人家就是破解不了呢哈哈哈哈&#xff01;&#xff01;&#xff01; 1、脚本之家 推荐&#xff1a;HTML原代码加、解密脚本 https://www.jb51.net/tools/html_jiami.htm CSS代码格式化和…

原型链继承

转载于:https://www.cnblogs.com/cmblog/p/8079773.html

清洁责任–摆脱均等,compareTo和toString

您是否看过Java中Object类的javadoc&#xff1f; 大概。 您倾向于时不时地到达那里&#xff0c;然后沿着继承树进行挖掘。 您可能已经注意到的一件事是&#xff0c;每个类都必须继承许多方法。 实现自己而不是坚持使用原始方法的最喜欢的方法可能是.toString&#xff08;&#…

密码保护

1.更新User对象&#xff0c;设置对内的_password class User(db.Model): __tablename__ user _password db.Column(db.String(200), nullableFalse) #内部使用 2.编写对外的password from werkzeug.security import generate_password_hash, check_password_hash property d…

linux 安装wdcp控制面板

**wdCP是WDlinux Control Panel的简称,**是一套通过WEB控制和管理服务器的Linux服务器管理系统以及虚拟主机管理系统。 可以查看服务器情况,资源利用率,系统负载,内存使用率,带宽使用率&#xff1b; 可以轻松创建网站,开站点,发布网站,创建FTP,创建mysql数据库&#xff1b; 可以…