14、策略模式(Strategy Pattern)

策略模式(Strategy Pattern)为同一个行为定义了不同的策略,并为每种策略都实现了不同的方法。在用户使用的时候,系统根据不同的策略自动切换不同的方法来实现策略的改变。同一个策略下的不同方法是对同一功能的不同实现,因此在使用时可以相互替换而不影响用户的使用。

以旅游交通工具的选择为例实现策略模式,UML设计图如下:

1)TravelStrategy类:

java 复制代码
package cn.jaa.strategy_pattern;

/**
 * @Author: Jaa
 * @Description: 出行方式策略类
 * @Date 2023/12/3 9:56
 */
public interface TravelStrategy {
    public void travelMode();
}

2)TravelStrategy的两种实现方式TravelByAirStrategy和TravelByCarStrategy:

java 复制代码
package cn.jaa.strategy_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/3 9:57
 */
@Slf4j
public class TravelByAirStrategy implements TravelStrategy {
    @Override
    public void travelMode() {
        log.info("travel by airport ...");
    }
}
java 复制代码
package cn.jaa.strategy_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/3 9:58
 */
@Slf4j
public class TravelByCarStrategy implements TravelStrategy {
    @Override
    public void travelMode() {
        log.info("travel by car ...");
    }
}

3)Context实现策略模式:

java 复制代码
package cn.jaa.strategy_pattern;

/**
 * @Author: Jaa
 * @Description: Context实现策略模式
 * @Date 2023/12/3 10:00
 */
public class Context {
    private TravelStrategy travelStrategy;

    public TravelStrategy getTravelStrategy() {
        return travelStrategy;
    }

    public void setTravelStrategy(TravelStrategy travelStrategy) {
        this.travelStrategy = travelStrategy;
    }

    public void travelMode() {
        this.travelStrategy.travelMode();
    }
}

4)测试策略模式:

java 复制代码
package cn.jaa.strategy_pattern;

import lombok.extern.slf4j.Slf4j;

/**
 * @Author: Jaa
 * @Description:
 * @Date 2023/12/3 10:02
 */
@Slf4j
public class StrategyDemoTest {

    public static void main(String[] args) {
        Context context = new Context();
        TravelByAirStrategy airStrategy = new TravelByAirStrategy();
        context.setTravelStrategy(airStrategy);
        context.travelMode();
        log.info("change air to airport ... ...");
        TravelByCarStrategy carStrategy = new TravelByCarStrategy();
        context.setTravelStrategy(carStrategy);
        context.travelMode();
    }
}

打印结果:

相关推荐
小羊没烦恼!9 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
范中勤10 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
浅尝辄止;13 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤13 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
408高手1 天前
23种设计模式
设计模式
沫璃染墨1 天前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
sarasuki1 天前
MCP 为什么是一个协议而不是一个框架呢?
设计模式·agent·mcp
geovindu2 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
染指11102 天前
140.Agent-多Agent框架-Agent执行Skills流程
数据库·人工智能·设计模式·langchain·agents
sarasuki2 天前
Agent 是怎么做错误处理的呢?
人工智能·设计模式·agent