写这个模式之前,实在是觉得策略模式和静态工厂模式很像,无非就是从父类中抽象中公用的方法,然后在实体类中重写具体的实现。但其实这两者的区别还是有的,从关注的点来说,静态工厂关注实例化的对象,而策略模式则更关注方法中不同的实现,先上代码吧。
抽象类和实现的实体,与静态工厂一样。
抽象类:
abstract class Operation {
public abstract void AlgorithmInterface();
}
实现类:
public class OperationAdd extends Operation{
@Override
public void AlgorithmInterface() {
// TODO Auto-generated method stub
System.out.println("加法运算");
}
}
public class OperationSub extends Operation {
@Override
public void AlgorithmInterface() {
// TODO Auto-generated method stub
//减法运算
System.out.println("减法运算");
}
}
上下文类:
public class OperationContext {
private Operation operation;
public OperationContext(String type){
switch (type) {
case "add":
OperationAdd operationAdd = new OperationAdd();
operation = operationAdd;
break;
case "sub":
OperationSub operationSub = new OperationSub();
operation = operationSub;
break;
default:
break;
}
}
public void getResult(){
operation.AlgorithmInterface();
}
}
客户端代码:
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
OperationContext context = new OperationContext("add");
context.getResult();
}
}
其实区别最大的就是客户端的部分,我们来对比静态工厂:
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Operation operation= new OperationFactory.create("add");
}
}
对于策略模式,我们只需要了解OperationContext这一个类,所有和这个类相关的算法都封装在这个类里,这个类可以看做是所有算法的集合类,而在工厂模式中,除了关注工厂类,还需要关注算法的父类Operation,显然,从算法的角度来说,策略模式的耦合度更低。