出于对设计模式的学习复习,才决定写的这一系列文章,一方面是帮助自己更快的复习记忆,另一方面是帮助有需要的人快速入门,分享自己的学习内容吧。
图片来源网络
设计模式是众多经验丰富的工程师经过大量的实验花费了很多很多时间才总结出来的,可以说是众多经验的结晶了。在所有的中、大型项目中,设计模式随处可见。使用设计模式,是为了提高代码的可重用性、可读性以及可靠性。适当的使用设计模式可以为日后扩展节省不少工作量,尽可能避免未知bug,提升项目性能。
理所当然的,所有的设计模式首先都应该需要遵从的必须是程序开发的六大原则了。如果你对六大原则还不理解,可以看看这篇文章帮你快速了解:最通俗易懂的java 六大原则--代码解析。
设计模式有20余种,可分为:
下面将讲解策略模式,分为:
1、概念解析
2、代码讲解
3、核心思想
4、优缺点
顾名思义,针对策略的设计模式。主要解决多种相似的算法,根据不同情况出现的if 。。。else的判断,多层if嵌套逻辑复杂,难以理解和维护。下面看个主要流程图
结合代码分析
首先是一个战斗策略的基本接口类,战斗策略分为初级、中级、高级。根据不同情况使用不同策略。
/**
* create time on 2019/6/22
* function: 战斗策略接口类
*/
public interface FightStragegy {
void fight();
}
/**
* create time on 2019/6/22
* function: 初级战斗策略
*/
public class LowStragegy implements FightStragegy {
private String TAG = "chenhua";
@Override
public void fight() {
Log.i(TAG, "fight: low");
}
}
/**
* create time on 2019/6/22
* function: 中级战斗策略类
*/
public class MiddleStrage implements FightStragegy {
private String TAG = "chenhua";
@Override
public void fight() {
Log.i(TAG, "fight: middle");
}
}
/**
* create time on 2019/6/22
* function: 高级战斗策略类
*/
public class HeightMiddle implements FightStragegy {
private String TAG = "chenhua";
@Override
public void fight() {
Log.i(TAG, "fight: hiegh");
}
}
/**
* create time on 2019/6/22
* function: 策略封装调用类,之所以写这个类,是为了减少日后接口修改带来的修改工作量
*/
public class StargeContext {
private FightStragegy fightStragegy;
public StargeContext(FightStragegy fightStragegy) {
this.fightStragegy = fightStragegy;
}
public void fight() {
fightStragegy.fight();
}
}
调用:
/**
* 这里的whichIndex是模拟其他因素的判断,针对不同的因素
*/
switch (whichIndex) {
case 1:
stargeContext = new StargeContext(new LowStragegy());
break;
case 2:
stargeContext = new StargeContext(new MiddleStrage());
break;
case 3:
stargeContext = new StargeContext(new HeightMiddle());
break;
}
if(stargeContext!=null){
stargeContext.fight();
}
策略模式的核心思想主要是为了避免多层的判断语句,增强代码可读性。遇到那种判断多的,可以考虑使用。他的核心侧重点是对策略模式的封装,依次达到减少判断语句嵌套问题。
有一个问题,为什么要创建一个StargeContext类呢?不是多此一举吗?部分代码:
FightStragegy fightStragegy = null;
/**
* 这里的whichIndex是模拟其他因素的判断,针对不同的因素
*/
switch (whichIndex) {
case 1:
stargeContext = new StargeContext(new LowStragegy());
fightStragegy = new LowStragegy();
直接去调用接口的方法不就好了吗??
fightStragegy.fight();
我看到的策略模式都是这么写的,本人对此抱有疑虑。就算日后增加新的策略,只要增加一个类实现策略接口也是可以的,那么对于StargeContext,感觉有些多余。有看到的大佬可以帮忙解释下~目前的强行解释是:1,对于部分策略可能还需要其他方法,StargeContext类在需要的时候可以在里面编写部分逻辑代码,这样在调用的时候就不用写这些代码了。2,如果需要修改整体的接口方法或者逻辑,只需要改StargeContext类的方法就可以,因为我们写的时候是直接调用StargeContext的fight方法的,这样就不用到处去改了。
优点上文也提到了,就是可以大幅度降低if else的各种逻辑嵌套,提升代码可读性。
缺点也很明显,对于一个策略就要增加一个类,策略多了类也就多了。