介绍:
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
主要解决:
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
实现:
- 策略组件-01
/**
* 基础策略接口
*
* @author liuyuan
* @version PHStrategy.java, v 0.1 2020-04-13 9:15
*/
public interface PCStrategy {
/**
* 策略执行接口
*/
void execute();
}
/**
* @author liuyuan
* @version Iphone.java, v 0.1 2020-04-13 9:18
*/
public class Mac implements PCStrategy {
@Override
public void execute() {
System.out.println("Mac开始执行了~~~");
}
}
/**
* @author liuyuan
* @version Android.java, v 0.1 2020-04-13 9:17
*/
public class Windows implements PCStrategy {
@Override
public void execute() {
System.out.println("Windows策略开始执行了~~~");
}
}
- 策略组件-02
/**
* 基础策略接口
*
* @author liuyuan
* @version PHStrategy.java, v 0.1 2020-04-13 9:15
*/
public interface PHStrategy {
/**
* 策略执行接口
*/
void execute();
}
/**
* @author liuyuan
* @version Iphone.java, v 0.1 2020-04-13 9:18
*/
public class Iphone implements PHStrategy {
@Override
public void execute() {
System.out.println("Iphone开始执行了~~~");
}
}
/**
* @author liuyuan
* @version Android.java, v 0.1 2020-04-13 9:17
*/
public class Android implements PHStrategy {
@Override
public void execute() {
System.out.println("Android 策略开始执行了~~~");
}
}
- Context
import com.example.designmode.strategy.pcstrategy.PCStrategy;
import com.example.designmode.strategy.phonestrategy.PHStrategy;
/**
* @author liuyuan
* @version Context.java, v 0.1 2020-04-13 9:18
*/
public class Context {
private PCStrategy pcStrategy;
private PHStrategy phStrategy;
/**
* Setter method for property <tt>PHStrategy</tt>.
*
* @param pcStrategy value to be assigned to property PHStrategy
*/
public void setPcStrategy(PCStrategy pcStrategy) {
this.pcStrategy = pcStrategy;
}
/**
* Setter method for property <tt>phStrategy</tt>.
*
* @param phStrategy value to be assigned to property phStrategy
*/
public void setPhStrategy(PHStrategy phStrategy) {
this.phStrategy = phStrategy;
}
public void pcExecute() {
pcStrategy.execute();
}
public void phExecute() {
phStrategy.execute();
}
}
- 测试
import com.example.designmode.strategy.pcstrategy.Mac;
import com.example.designmode.strategy.pcstrategy.Windows;
import com.example.designmode.strategy.phonestrategy.Android;
import com.example.designmode.strategy.phonestrategy.Iphone;
/**
* @author liuyuan
* @version Test.java, v 0.1 2020-04-13 9:20
*/
public class Test {
public static void main(String[] args) {
Context context = new Context();
// 注入策略组件
context.setPcStrategy(new Mac());
// 执行策略方法
context.pcExecute();
context.setPcStrategy(new Windows());
context.pcExecute();
context.setPhStrategy(new Iphone());
context.phExecute();
context.setPhStrategy(new Android());
context.phExecute();
}
}
补充:
spring项目中,可以考虑将Context类去掉,采用枚举维护 类型:类别名 的方式,通过spring的上下文直接获取对应的实现类,执行组件的策略方法。