策略模式(Strategy Pattern)为同一个行为定义了不同的策略,并为每种策略都实现了不同的方法。在用户使用的时候,系统根据不同的策略自动切换不同的方法来实现策略的改变。同一个策略下的不同方法是对同一功能的不同实现,因此在使用时可以相互替换而不影响用户的使用。
以旅游交通工具的选择为例实现策略模式,UML设计图如下:
1)TravelStrategy类:
package cn.jaa.strategy_pattern;
/**
* @Author: Jaa
* @Description: 出行方式策略类
* @Date 2023/12/3 9:56
*/
public interface TravelStrategy {
public void travelMode();
}
2)TravelStrategy的两种实现方式TravelByAirStrategy和TravelByCarStrategy:
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 ...");
}
}
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实现策略模式:
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)测试策略模式:
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();
}
}
打印结果: