java计数器策略模式_java设计模式(二十一)--策略模式

对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用。 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略接口 策略实现类 策略作用类(使用策略的类) 网络上的专业解释:

此模式下,一个类的行为或者其算法可以在运行时更改,我们要定义一系列的算法,把他们一个个封装起来,并使他们可以相互替换。

实例:用此模式描述四则运算,可不断替换。

以下是我对此实例做的类图:

a2c4ab23150860c493ca1a1f36c6b982.png

以下是我编写代码: 1.创建策略接口,用来存放四则运算计算器中的不同运行的方法

//策略接口

interface Strategy {

int doAction(int num1,int num2);

}

2.创建实现策略接口的四则计算实现类

public class AddStrategy implements Strategy {

@Override

public int doAction(int num1, int num2) {

return num1+num2;

}

}

public class SubtractStrategy implements Strategy{

@Override

public int doAction(int num1, int num2) {

return num1-num2;

}

}

public class MultiplyStrategy implements Strategy {

@Override

public int doAction(int num1, int num2) {

return num1*num2;

}

}

public class DivisionStrategy implements Strategy {

@Override

public int doAction(int num1, int num2) {

return num1/num2;

}

}

3.创建一个使用某种策略的类,可以根据需求不同来使用不同的策略

public class Calculator {

private int num1;

private int num2;

public Calculator(int num1, int num2) {

this.num1 = num1;

this.num2 = num2;

}

public int operate(Strategy strategy){

return strategy.doAction(num1, num2);

}

}

4.创建测试类,使用不同的策略来实现需求

public class Test {

public static void main(String[] args) {

System.out.println("=========加法计算器==========");

Calculator calculator=new Calculator(1, 2);

System.out.println("1+2="+calculator.operate(new AddStrategy()));

System.out.println("=========减法计算器==========");

Calculator calculator1=new Calculator(10, 20);

System.out.println("10-20="+calculator1.operate(new SubtractStrategy()));

System.out.println("=========乘法计算器==========");

Calculator calculator2=new Calculator(3, 5);

System.out.println("3*5="+calculator2.operate(new MultiplyStrategy()));

System.out.println("=========除法计算器==========");

Calculator calculator3=new Calculator(10, 2);

System.out.println("10/2="+calculator3.operate(new DivisionStrategy()));

}

}

5.后台输出

=========加法计算器==========

1+2=3

=========减法计算器==========

10-20=-10

=========乘法计算器==========

3*5=15

=========除法计算器==========

10/2=5

看完代码之后,大家是不是感觉这种模式与状态模式是差不多的,是差不多,他俩原理都是用的覆盖嘛,但是状态模式的状态作用者里面要用到状态的实例对象,但是这个策略模式的策略使用者却是将策略当做参数来传入的,这样减少了对象的创建,提高了性能。

这种模式的优点:

1.如果我们要加一个相反数策略的话,只需要实现策略接口即可,体现了易扩展性,符合”开闭原则”。

2.算法在客户端可以根据需要自由切换,适应了不同需求。

3.在客户端使用将策略对象参数化的方法来调用具体策略的方法,避免在客户端新建对象实例,提高系统性能。

缺点:

1.策略使用类要知道所有的策略类才行,然后才能自行决定要用哪一个策略。

2.随着策略的不断增多,策略类也会不断的增多,提高后期的维护困难性。

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

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

相关文章

linux setuid函数_setuid函数解析

在讨论这个setuid函数之前,我们首先要了解的一个东西就是内核为每个进程维护的三个UID值。这三个UID分别是实际用户ID(real uid)、有效用户ID(effective uid)、保存的设置用户ID(saved set-user-ID)。首先说这个实际用户ID,就是我们当前以哪个用户登录了…

java中asl_带你认识绕不开的ASLR

微软从windows vista/windows server 2008(kernel version 6.0)开始采用ASLR技术,主要目的是为了防止缓冲区溢出ASLR技术会使PE文件每次加载到内存的起始地址随机变化,并且进程的栈和堆的起始地址也会随机改变。ASLR(Address space layout randomization…

Java 捕获 mybatis异常_3 springboot集成mybatis和全局异常捕获

mybatis有两种方式,一种是基于XML,一种是基于注解springboot集成mybatis首先先创建表,这里都简化了DROP TABLE IF EXISTS user;CREATE TABLE user (id int(11) NOT NULL auto_increment,username varchar(255) default NULL,PRIMARY KEY (id)…

java applet 访问文件_使用JavaApplet访问数据库

使用Java Applet访问数据库学习任何的程序语言,当然都得与数据库,Java刚刚诞生的时候,对数据库的支持并不是很好,经过这几年的发展,它对数据库的支持也已经完全达到了成熟的境地。由于这里主要是介绍Java Applet小程序…

与java线程有关的,线程多少和什么有关?大神们表示有话要说!

原标题:线程多少和什么有关?大神们表示有话要说!来源:importnew.com/10780.htmlEddie的回答:Charlie Martin的回答:benjismith的回答:Neil Coffey的回答:McGovernTheory在StackOverflow提了这样一个问题:Java虚拟机最多支持多少个…

java 项目 人力资源项目,基于jsp的人力资源系统-JavaEE实现人力资源系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的人力资源系统, 该项目可用各类java课程设计大作业中, 人力资源系统的系统架构分为前后台两部分, 最终实现在线上进行人力资源系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类人力资源系统相关的实体…

matlab最佳拟合的指标是什么意思,Matlab拟合好坏常用指标

Matlab拟合好坏常用指标用过Matlab的拟合、优化和统计等工具箱的网友,会经常遇到下面几个名词:SSE(和方差、误差平方和):The sum of squares due to errorMSE(均方差、方差):Mean squared errorRMSE(均方根、标准差):R…

matlab数字图像处理函数,MATLAB数字图像处理学习(二)|常用函数

以下的学习整理来自《数字图像处理原理与实践(MATLAB版)》im2bw功能:将索引图象、灰度图像和RGB彩色图像转换为二值图像 调用形式: >BW im2bw(I,level) BW im2bw(X,cmap,level) BW im2bw(RGB,level)其中level用于设置阈值。level取值范围[0, 1]。 …

php 实现 model层,Thinkhphp5控制器调用的Model层的方法总结

控制器器里:/*** Created by PhpStorm.* User: Haima* Date: 2018/7/8* Time: 15:58*/namespace app\api\controller\v1;use app\api\model\Banner as BannerModel;use app\api\validate\IDMustBePostiveInt;use app\lib\exception\BannerMissException;class Banner{/*** 获取…

matlab fminimax 例子,Matlab应用实例(8)—fminimax

说明:fminimax用来求最小的最大值,比如城市建设消防站点时,考虑到最主要的因素是到最远的地方的用时(可换算为距离)最小,比如A方案到6个区域的用时为(1,1,1,1,1,12)&…

php://filter利用条件,浅谈php://filter技巧

php://filterphp://filter可以作为一个中间流来处理其他流,具有四个参数:名称描述备注resource指定了你要筛选过滤的数据流必选read可以设定一个或多个过滤器名称,以管道符(|)分隔。可选write可以设定一个或多个过滤器名称,以管道符(|)分隔。…

mplayer-php,mplayer+smplayer 前后端播放器安装

环境:f8模式:mplayer做后端,smplayer做前端说明:如果是自己编译mplayer,后面所讲到的codecs路径就可能发生变化,做适当修改即可!以下省略一些解压缩之类的操作步骤!安装livna.org的第…

Elasticsearch的分片平衡问题解决

2023年11月份在某电商系统生产中的Elasticsearch(以下简称ES)集群突然,出现了大量慢查询告警,导致请求堆积。经过几天的排查发现了ES节点主分片和副本分片分布存在不均匀的问题。当然了暂未有定论是由于分片不均衡导致了性能下降&…

linux卸载nomachine,NoMachine 安装与配置及使用

对Linux管理员们来说,远程办公不是什么新鲜事。如果管理员不在服务器跟前,远程办公更是家常便饭。一般而言,图形用户界面(GUI)默认情况下并不安装在Linux服务器上。但是可能有一些Linux管理员还是决定将GUI安装在Linux服务器上。如果你的服务…

linux yum 安装widget,CentOS 7安装Qt5.12.1过程

默认下载在Downloads目录下预安装sudo yum -y install mesa-libGL-devel mesa-libGLU-devel freeglut-devel给下载的文件赋予可执行的权限chmod x qt-opensource-linux-x64-5.12.1.run执行文件,进行安装./qt-opensource-linux-x64-5.12.1.run接下来会进行界面化的安…

usb otg vnc linux,20131126版本后,可以从PC通过USB-OTG VNC到pcDuino

为什么80%的码农都做不了架构师?>>>有些玩家购买pcDuino到手后发现自己没有显示器,没有鼠标键盘,有的只有手机的充电器和数据线。pcDuino开发者了解到粉丝们的郁闷之后,在软件上帮忙大家解决了这个问题。下面就给大家介绍…

linux 镜像错误,VituralBox 使用已有镜像文件报错:E_INVALIDARG (0x80070057)

VituralBox 使用已有镜像文件报错:E_INVALIDARG (0x80070057):问题描述:UUID已经存在Cannot register the hard disk E:\system_iso\CentOS6.8.vdi {05f096aa-67fc-4191-983d-1ed00fc6cce9}because a hard disk E:\system_iso\centos68_02\centos6.8.vdi…

c语言中123 234 345 456,如何在C中将数字从1123456789格式化为1,123,456,789?

宝慕林4294392您可以按以下方式递归执行此操作(请注意&#xff0c;INT_MIN如果使用二进制补码&#xff0c;则需要额外的代码来管理它)&#xff1a;void printfcomma2 (int n) { if (n < 1000) { printf ("%d", n); return; } printfcomma2…

dos c语言显示符号图案,在DOS命令行窗口中显示出用各种字符拼凑出来的各种图案的实现方法,如本人头像...

注&#xff1a;文中例子是本人刚学C编程语言的时候制作的&#xff0c;实现方法很简单&#xff0c;主要使用for循环语句&#xff0c;无需什么复杂烧脑的算法。由于经常看到各种符号拼成的图案&#xff0c;感觉很有意思&#xff0c;所以自己也弄了个&#xff0c;纯属好玩。(作品-…

android自定义圆圈动画,自定义view实现动画数字圆圈

我们要实现的是如下的效果&#xff0c;1.该view在设置属性之后时候会有数字和圆圈不断增长的效果2.该view在按下和放开状态下显示不同的样式。这种效果逻辑上并不复杂&#xff0c;底层灰色圆圈和蓝色扇形圆圈都是用canvas.drawArc()绘制出来的&#xff0c;中间的数字用drawtext…