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,一经查实,立即删除!

相关文章

java负数十进制转二进制_java中负数的补码转换为十进制

C++全局和静态变量初始化转自:http://www.cnblogs.com/zhenjing/archive/2010/10/15/1852116.html 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的 ...eclips常用快捷键本文取自:Eclipse中常用快捷键 - yizhang88的专栏 - 博客频道 - CSD…

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复杂性_java – 计算Big-O复杂性

我最终会给这个程序一个类似60,000个400像素图像的输入文件,所以我试着想一想这个代码如何用大输入运行.为了便于阅读,我用“blah”和所有带有简单字母(nn,mm和kk)的ArrayList名称替换了不重要的东西.for (Perceptron P : nn){//blah}for (Perceptron P : mm) {//blah}for (Per…

java泛型与接口_Java泛型用于方法,类和接口

什么是泛型?型就是数据类型参数化。就是说原本定死的数据类型像方法中的形参一样,数据是不确定的,使用的时候由人传进去,泛型就是这样,数据类型不确定了。使用的时候再确定就可以了。泛型的特点是JDK1.5的新特性泛型可…

unix系统编码 java_JAVA字符编码系列三:Java应用中的编码问题

这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题&#xff…

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背景图片加上组件_关于 java swing组件加背景图片的问题

最近自己做了一个小的进销存软件,背景图片加上后不能最大化。尝试了好几种方法 最后终于把问题解决了。下面把自己写的实例 分享一下:一个是在JFrame窗体中加如背景图片一个是在Jpanel 面板中加入背景图片都可以伸缩铺满整个屏幕,算是自己的一个小心得。…

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

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

java ip 范围内打卡_定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内

具体代码如下所述:/* 计算两组经纬度坐标之间的距离* param $lat1 纬度1* param $lng1 经度1* param $lat2 纬度2* param $lng2 经度2* param int $len_type 返回值类型(1-m 2-km)* param int $decimal 保留小数位数* return float*/public function getDistance($l…

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

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

php正则表达式 匹配数字,正则表达式之匹配数字范围

最近有个需求就是根据产品编号批量下架产品,需要下架日期为16-31号之间的产品,比如编号为B201607280023匹配表达式如下:^201607(1[6-9]|2[0-9]|3[0-1]).逻辑很简单,如果是必须是1或2或3开头,如果是1开头则后面范围为6-9&#xff0…

php中带?错误,参考-此错误在PHP中意味着什么?

这是什么?这是有关警告,错误和注意事项的许多答案,这些警告,错误和注意事项在您对PHP进行编程时可能会遇到,并且不知道如何解决它们。这也是一个社区Wiki,因此邀请所有人参与添加并维护此列表。为什么是这样…

yiilite.php,YII Framework学习教程-YII的V-view的render若干函数-2011-11-17 | 学步园

YII中,在action可以通过$this->render来指定它的view。其实还其他一$this->render开头的函数。yiilite.php中有这么几个函数。public function renderText($text,$returnfalse){if(($layoutFile$this->getLayoutFile($this->layout))!false)$text$this-…

php生成链接列表,根据URL链接和抛文本生成链接a标签的PHP函数

这个函数可以为组成一个链接,第一个参数是链接的URL,第二个参数是抛文本。最后生成抛文本function parseurl($url, $text) {if(!$url && preg_match("/((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k|thunder|synacast){1}:\…

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

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

php阿拉伯语字符串,按字母顺序命名阿拉伯语名称Mysql和php

我试图用阿拉伯语对 alphabetical order 中的结果进行排序,但出于某种原因 not sorting correctly ..$ d1 mysqli_query($ connector,“SELECT * FROM article where type 1ORDER BY name ASC”); while($ a1 mysqli_fetch_array($ d1)){echo“$ a1 [n…

matlab里inline定义矩阵,Matlab中的inline函数_matlab中inline函数

Matlab中的inline函数1.有时为了描述某个数学函数的方便,可以用inline()函数来直接编写该函数,形式相当于M-函数,但无编写一个真正的MATLAB文件,就可以描述出某种数学关系。其调用格式为funinline(‘函数内容’,自变量…

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

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

matlab保存并关闭excel文件夹,[转载]Matlab批量操作目标文件夹下的Excel文件

本程序主要使matlab批量操作Excel表,其中用到了parfor并行计算加快处理速度。相同效果,速度上和Excel vba是有差距的。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%tic;clear;dirsdir(E:我的文…