我们需要根据不同的需求给出不同的解决方案,如果使用条件判断,这时候如果有新增的类型就会破坏开放封闭原则,这时候就需要使用策略模式。常用的使用场景有Spring框架中的Resource接口等。
在策略模式中有以下的几种对象: 2.1环境(Context)角色:持有一个Strategy的引用。 2.2抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 2.3具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。 具体的UML示意图如下:
首先,定义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); } }
策略模式实际就是一种对算法进行分离的设计模式,客户端能够自行判断调用哪个算法。 代码链接:https://github.com/memoryexplosion/design_pattern_review/tree/master/src/java/strategy