设计模式-策略模式
策略模式 1.定义与类型
- 定义:定义了算法家族,分别封装起来,让他们之间可以互相转换,此模式让算法的变化不会影响到使用算法的用户
- if...else
- 类型:行为型
- 系统有很多类,而他们的区别仅仅在于他们的行为不同
- 一个系统需要动态地在几种算法中选择一种
- 开闭原则
- 避免使用多种条件转移语句
- 提高算法的保密性和安全性
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 产生很多策略类
- 策略模式 和 工厂模式
- 策略模式 和 状态模式
- 创建策略接口Promotion
public interface PromotionStrategy {
void doPromotion();
}
- 创建一系列促销策略
public class FanXianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("返现促销,返回的余额存放到用户余额中!");
}
}
public class LiJianPromotionStrategy implements PromotionStrategy {
@Override
public void doPromotion() {
System.out.println("立减促销,课程的价格直接减去配置的价格");
}
}
public class ManJianPromotionStrategy implements PromotionStrategy{
@Override
public void doPromotion() {
System.out.println("满减促销:满200减20");
}
}
- 创建促销活动:用来执行促销策略的类
public class PromotionActivity {private PromotionStrategy strategy;
public PromotionActivity(PromotionStrategy strategy){
this.strategy = strategy;
}public void executeStrategy(){
strategy.doPromotion();
}
}
- 创建促销策略工厂
/**
* @program: design_pattern
* @description: 促销策略工厂
* @create: 2021-10-13 22:23
**/
public class PromotionStrategyFactory {/** 私有化构造器*/
private PromotionStrategyFactory(){}private staticfinal MapPROMOTION_STRATEGY_MAP = new HashMap<>();
//初始化工厂
static {
PROMOTION_STRATEGY_MAP.put(PromotionType.FANXIAN,new FanXianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionType.LIJIAN,new LiJianPromotionStrategy());
PROMOTION_STRATEGY_MAP.put(PromotionType.MANJIAN,new ManJianPromotionStrategy());
}/** 对外提供获取策略的方法 */
publicstatic PromotionStrategy getPromotionStrategy(String promotionKey){
PromotionStrategy promotionStrategy = PROMOTION_STRATEGY_MAP.get(promotionKey);
return promotionStrategy == null?null:promotionStrategy;
}private interface PromotionType{
String LIJIAN = "LIJIAN";
String MANJIAN = "MANJIAN";
String FANXIAN = "FANXIAN";
}}
- 测试类
public class Test {
public static void main(String[] args) {
String promotionKey = "LIJIAN";
PromotionActivity promotionActivity =
new PromotionActivity(PromotionStrategyFactory.getPromotionStrategy(promotionKey));
promotionActivity.executeStrategy();
}
}
- 控制台输出:
文章图片
7.总结
- 策略模式结合工厂模式减少了if...else代码,提高了代码的效率和可维护性
- 代码的解耦
- 策略类中都有共同的行为,不过这个行为的结果不一样
推荐阅读
- 硬笔楷书26
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 《教育心理学》读书笔记十四---学校班级管理的现状分析与策略研究