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();
    }
}

打印结果:

相关推荐
步行cgn13 小时前
适配器设计模式:一个“翻译官”的故事
设计模式
扶尔魔ocy16 小时前
【QT C++】常用设计模式
c++·设计模式
她说..17 小时前
常见设计模式-观察者模式
java·spring boot·spring·观察者模式·设计模式
是2的10次方啊18 小时前
设计模式与生活⑨:一碗胡辣汤,用不着认识十几种香料
设计模式
geovindu2 天前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
是2的10次方啊2 天前
设计模式与生活⑧:快递到了,别一直刷物流
设计模式
zhangfeng11332 天前
com.apple.quarantine 并不是乱码,而是 macOS Gatekeeper 给下载文件自动打上的“隔离属性
macos·策略模式
raindayinrain3 天前
c++设计模式
开发语言·c++·设计模式
工一木子3 天前
设计模式与生活⑦:你打的车,隔着一个平台
设计模式
电子科技圈3 天前
2026 RISC-V中国峰会观察:编译调试工具链的“在场节奏”,释放了什么信号?
大数据·人工智能·设计模式·软件工程·软件构建·代码规范·risc-v