设计模式(一)
Java语言学习设计模式
设计模式之策略模式
策略模式是什么?可能第一次听到都会觉得很高大上,逼格很高的样子,但是,根据该设计模式的取名和生活经验也可以连蒙带猜嘛,策略是什么,就是解决问题的一种方式,就是为了达到某种目的而选择的方法。而策略模式在设计模式中就很好的体现了出了策略的含义。
菜鸟教程对策略模式的介绍如下:
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
简而言之,就是策略模式定义了算法族,并且封装起来,但是当使用该算法的用户,使用算法可以进行替换,就是说选择什么算法是客户决定的。(算法在这里指代的是一种行为,并不是具体的算法)
策略模式类图:
看了类图之后可能还是很懵逼,好的,那就举一个最简单的例子,也是策略模式最常用的例子:
计算器,对的就是那种最简单不过的计算器,只针对两个数操作的计算器,我们可以把计算器所实现的功能按照设计模式给套进去。
如图:
计算器策略模式的代码实现如下:
策略部分:
计算策略接口:
public interface Calculate {
Float doWhat(Float numA, Float numB);
}
加法:
import edison.study.calcultemode.Calculate;
public class CalculateAdd implements Calculate {
@Override
public Float doWhat(Float numA, Float numB) {
return numA + numB;
}
}
减法:
import edison.study.calcultemode.Calculate;
public class CalculateSub implements Calculate {
@Override
public Float doWhat(Float numA, Float numB) {
return numA - numB;
}
}
内容部分:
计算器:
public class Calculator {
private Calculate calculate;
public void setCalculate(Calculate calculate) {
this.calculate = calculate;
}
public Float doWhat(Float numA, Float numB) {
return this.calculate.doWhat(numA, numB);
}
}
测试主类:
import edison.study.calcultemode.impl.CalculateAdd;
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.setCalculate(new CalculateAdd());
Float result = calculator.doWhat(1.5F, 2.2F);
System.out.println(result);
}
}
测试结果:
在看完计算器这个例子之后,小伙伴们可能会有一个疑问,我们按照平时写代码的逻辑,将策略算法直接作为方法直接写,岂不是更加方便。使用策略模式之后感觉代码还更加多写了一点。
在这里我们就要思考一下了,当你所提供的功能是作为一个jar包给别人引用的时候。就拿计算器举例子,你写了一个计算器给计算中心使用,计算中心最开始只使用加法和减法,后面如果想用乘法和除法了呢。你千万别说,在计算器类里面加一个方法不就好了?OK,大兄弟你提供给别人使用的计算器是已经打成jar包,难道你让计算中心的人反编译一下?再加一个方法,显然这样是不可取的。
所以当我们使用了策略模式之后,我们直接可以和计算中心的人说,你想要乘法也好,除法也好,自己写一个,new一下就好了。这样也就很好的体现了设计模式的基本原则:“开闭原则”,也就是说:“对拓展放开,对修改关闭”。
我们平时的很多行为都可以使用策略模式:
当我们旅行时选择交通工具;
当我们选择支付方式的时候;
当我们选择听歌软件的时候;
这些都可以自己用策略模式想想,如果用代码实现,该如何实现。