===============
1、何时使用
对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。
一旦代码中if-else过多,就会大大的影响其可读性和可维护性,而且代码显得很low。
策略模式完美的解决了ifelse的烦恼!
2、方法
将这些算法封装成一个一个的类,任意的替换
3、应用实例
-
出行方式,自行车、汽车等,每一种出行方式都是一个策略
-
商场促销方式,打折、满减等
-
java AWT中 LayoutManager ,即布局管理器
4、注意事项
如果一个系统的策略多于四个,就需要考虑使用混合模式解决策略类膨胀的问题
四、代码实例
==========
下面就以商场促销为例使用策略模式实现商场促销算法。UML图如下:
1、上下文类
首先声明一个 CashSuper 对象,通过构造方法,传入具体的收费策略, getResult() 方法的功能为根据收费策略的不同获取计算结果。
package designMode.strategy;
public class CashContext {
private CashSuper cashSuper;
public CashContext(CashSuper cashSuper) {
this.cashSuper = cashSuper;
}
public double getResult(double money){
return cashSuper.acceptCash(money);
}
}
2、现金收费抽象类
策略类,为抽象类,抽象出收费的方法供子类实现。
package designMode.strategy;
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
3、正常收费子类
package designMode.strategy;
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
4、打折收费子类
package designMode.strategy;
public class CashRebate extends CashSuper {
private double moneyRebate = 0.8;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
5、返利收费子类
package designMode.strategy;
public class CashReturn extends CashSuper {
private double moneyConditation = 0.0;
private double moneyReturn = 0.0d;
public CashReturn(double moneyConditation, double moneyReturn) {
this.moneyConditation = moneyConditation;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
double result = money;
if(money>moneyConditation){
result = money-Math.floor(money/moneyConditation)*moneyReturn;
}
return result;
}
}
6、client客户端
package designMode.strategy;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
CashContext cashContext = null;
Scanner scanner = new Scanner(System.in);
System.out.println(“请输入打折方式(1/2/3):”);
int in = scanner.nextInt();
String type = “”;
switch (in){
case 1:
cashContext = new CashContext(new CashNormal());
type += “正常收费”;
break;
case 2:
cashContext = new CashContext(new CashReturn(300,100));
type +=“满300返100”;
break;
case 3:
cashContext = new CashContext(new CashRebate(0.8));
type += “打八折”;
break;
default:
System.out.println(“请输入1/2/3”);
break;
}
double totalPrices = 0;
System.out.print(“请输入单价:”);
double price = scanner.nextDouble();
System.out.println(“请输入数量:”);
double num = scanner.nextDouble();
totalPrices = cashContext.getResult(price * num);
System.out.println(“单价:” + price + “,数量:” + num + “,类型:” + type + “,合计:” + totalPrices);
scanner.close();
}
}
7、运行结果
五、策略模式与工程模式的区别
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://img-blog.csdnimg.cn/img_convert/58630ceffae05d8695fa2184eb7fe63b.jpeg)
文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
[外链图片转存中…(img-ypVp49yu-1711479964146)]
- 第二个就是数据库的高频知识点与性能优化
[外链图片转存中…(img-mfancU7W-1711479964146)]
- 第三个则是并发编程(72个知识点学习)
[外链图片转存中…(img-qEvrmdEl-1711479964146)]
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
[外链图片转存中…(img-C3oIrck0-1711479964147)]
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!