1.使用场景:
我们需要根据不同的需求给出不同的解决方案,如果使用条件判断,这时候如果有新增的类型就会破坏开放封闭原则,这时候就需要使用策略模式。常用的使用场景有Spring框架中的Resource接口等。
2.UML表示
在策略模式中有以下的几种对象:
2.1环境(Context)角色:持有一个Strategy的引用。
2.2抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
2.3具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
具体的UML示意图如下:
3.代码实现
首先,定义Strategy接口:
public interface Strategy {
public double getArea(double a,double b);
}
定义Context类:
public class Context {
private Strategy strategy;//当前的算法对象
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void printArea(double a,double b){
System.out.println("图形面积:"+strategy.getArea(a,b));
}
}
定义计算各种图形面积的方法(写的不是太严谨,这里只是用作演示):
public class Circular implements Strategy{
@Override
public double getArea(double a, double b) {
if (a==b)
return Math.PI*a*b;
return -1;
}
}
public class Rectangle implements Strategy {
@Override
public double getArea(double a, double b) {
return a*b;
}
}
public class Triangle implements Strategy {
@Override
public double getArea(double a, double b) {
return a*b/2;
}
}
简单测试类:
public class Client {
public static void main(String[] args) {
Strategy s1=new Rectangle();
Strategy s2=new Triangle();
Strategy s3=new Circular();
Context ctx=new Context(s3);
ctx.printArea(2,2);
}
}
4.总结
策略模式实际就是一种对算法进行分离的设计模式,客户端能够自行判断调用哪个算法。
代码链接:
https://github.com/memoryexplosion/design_pattern_review/tree/master/src/java/strategy