博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java计数器策略模式_java设计模式(二十一)--策略模式
阅读量:1540 次
发布时间:2019-04-21

本文共 2310 字,大约阅读时间需要 7 分钟。

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

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

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

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

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://zlrdy.baihongyu.com/

你可能感兴趣的文章
Python文档注释格式和生成文档
查看>>
Stone_Yannn博客:CUDA(《GPU高性能编程CUDA实战》修改版)和slam十四讲
查看>>
Vision4Robotics (V4R) 提供用于识别,分段,跟踪,注册等的模块
查看>>
视频下载youtube-dl
查看>>
显卡算力和版本-随手记
查看>>
WideBaselineFeatureMatcher一些细节
查看>>
特征匹配剔除方法-随手记
查看>>
python3.6(python-gcc:7.3)-anaconda-写c扩展-undefined symbol:找错误-ubuntu
查看>>
可视化显示json文件中的bbox和seg(labelme标注)
查看>>
ubuntu16.04画图软件看图kolourpaint
查看>>
wget下载文件-如果文件通过谷歌浏览器下载容易中断且还要重头再来
查看>>
linux 本地查看服务器图片-2种方式
查看>>
python-siftgpu(OpenCL版本)--并且改为ASIFT-GPU
查看>>
github克隆-完整克隆包括子模块
查看>>
级联 SIFT
查看>>
PCL显示点云-ICP(PCL1.9.1)
查看>>
opencv-特征描述符评估
查看>>
马佳义博士的工作
查看>>
Ubuntu点云开发环境
查看>>
IPOL Journal · Image Processing On Line代码期刊
查看>>