Java设计模式---策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法(或策略),并将每个算法封装起来,使得它们可以互相替换。策略模式允许算法的变化独立于使用算法的客户(即客户端代码)。简而言之,它让我们可以在运行时选择具体的算法,避免了大量的 if-elseswitch 语句。

策略模式的组成部分

策略模式主要有以下几个组成部分:

  1. Context(上下文):持有一个策略的引用,可以更换不同的策略来执行某个操作。
  2. Strategy(策略接口):定义一个策略接口,通常这个接口包含一个方法,这个方法是被策略实现类所共享的。
  3. ConcreteStrategy(具体策略):具体的策略类,实现策略接口,定义具体的算法或行为。
  4. Client(客户端):通过设置策略(ConcreteStrategy)来决定使用哪种具体策略。

策略模式的结构图

+---------------------+

| Context |

+---------------------+

| - strategy: Strategy |

+---------------------+

| + setStrategy() |

| + execute() |

+---------------------+

^

|

+-----------+-----------+

| |

+--------------+ +--------------+

| Strategy | | ConcreteStrategyA |

+--------------+ +---------------------+

| + algorithm()| | + algorithm() |

+--------------+ +---------------------+

+---------------------+

| ConcreteStrategyB |

+---------------------+

| + algorithm() |

+---------------------+

1.方法入口

java 复制代码
@Component
public class AppContext {
    @Autowired
    private List<AppStrategy> userAppStrategyList;

    private final Map<String, AppStrategy> STRATEGYMAP = new HashMap<>();

    @PostConstruct
    public void init() {
        userAppStrategyInterfaceList.forEach(strategy -> {
            STRATEGYMAP.put(strategy.type(), strategy);
        });
    }


    public void add(UserDto userDto) {
        STRATEGYMAP.entrySet().stream()
                .filter(entry -> entry.getKey().contains(userDto.getType().toString()))
                .findFirst()
                .ifPresent(entry -> entry.getValue().add(userDto));
    }

    
}

2.接口

java 复制代码
public interface AppStrategy {
    String type();

    void add(UserDto dto);

    
}

3.实现类

实现类1

java 复制代码
@Service
@Slf4j
public class AppCompanyService implements AppStrategy {
    
    @Override
    public String type() {
        return "1,2";
    }

    @Override
    public void add(UserDto dto) {
        log.info("调用了实现类1");
    }
}

实现类2

java 复制代码
@Service
@Slf4j
public class AppPersonService implements AppStrategy {
    
    @Override
    public String type() {
        return "3,4";
    }

    @Override
    public void add(UserDto dto) {
        log.info("调用了实现类2");
    }
}

4.调用

java 复制代码
@Service
@Slf4j
public class AppUserService {
    @Resource
    private AppContext appContext;

    @GlobalTransactional
    public void add(UserDto userDto) throws Exception {
        userDto.setType(1);
        appIdentityContext.add(userIdentityDto);
    }
}

这样就完成了一个策略模式的小demo。

相关推荐
mldong1 小时前
给若依加审批流,不用 Flowable
java·spring boot·架构
Wang's Blog3 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
讳疾忌医丶3 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
郑州光合科技余经理4 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼4 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
梦想平凡4 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
sunshine22 girl5 小时前
Idea中如何搜索
java·ide·intellij-idea
猫吻鱼6 小时前
【AI 01】【Spring AI 基础使用】
java·spring·spring ai
梨涡泥窝6 小时前
基于SSM的校园二手交易平台的设计与实现
java·tomcat
许彰午6 小时前
44-useRowSet镜像实现
java·低代码·架构