1. 策略模式概述
1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以相互替换,这个模式让算法的变化独立于使用算法的客户。
2)这算法表现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、接口编程不是具体的类(定义了策略接口);第三、多用组合/聚合,少用继承(通过组合方式使用策略)。
策略更适用于一个操作的不同实现方式,比如出行,你既可以选择飞机,火车,也可以徒步,不使用策略模式时通过if else处理,使用策略类,通过不同的策略创建不同的出行实例,可以提高扩展与维护下。
2. 策略模式实现
/**
* 出行策略类
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public abstract class TravelStrategy {
/**
* 定义算法,出行方法
*/
public abstract void travel();
}
/**
* 飞机出行
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public class AirPlaneStrategy extends TravelStrategy {
@Override
public void travel() {
System.out.println("飞机出行...");
}
}
/**
* 火车出行
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public class TrainStrategy extends TravelStrategy {
@Override
public void travel() {
System.out.println("火车出行...");
}
}
/**
* 徒步出行
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public class WalkStrategy extends TravelStrategy {
@Override
public void travel() {
System.out.println("徒步出行...");
}
}
/**
* 出行上下文类,这个很重要,策略的关键
* 这是一个上下文类,所有客户端都通过上下文类与不同算法交互,才能达到相互替换算法的效果
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public class TravelContext {
private TravelStrategy travelStrategy;
public TravelContext(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
// 定义调用算法的方法,封装调用细节
public void travel() {
travelStrategy.travel();
}
}
/**
* 模板测试类
*
* @author zrj
* @date 2020/12/7
* @since 1.0
*/
public class TravelTest {
@Test
public void travelTest() {
System.out.println("-------------火车出行----------------");
TravelContext trainContext = new TravelContext(new TrainStrategy());
trainContext.travel();
System.out.println("-------------飞机出行----------------");
TravelContext airPlaneContext = new TravelContext(new AirPlaneStrategy());
airPlaneContext.travel();
System.out.println("-------------徒步出行----------------");
TravelContext walkContext = new TravelContext(new WalkStrategy());
walkContext.travel();
}
}