策略模式(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 {@Overridepublic 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 {@Overridepublic 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();}
}
打印结果: