文档章节

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

合拍
 合拍
发布于 2017/08/24 21:37
字数 826
阅读 6
收藏 0

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

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

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

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

输入图片说明

以下是我编写代码: 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.随着策略的不断增多,策略类也会不断的增多,提高后期的维护困难性。

© 著作权归作者所有

合拍
粉丝 1
博文 24
码字总数 20938
作品 0
滨州
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
296
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
221
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
281
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
18分钟前
10
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
37分钟前
3
0
编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
49分钟前
8
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
今天
76
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部