策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法,并且都有各自不同的实现,这些算法实现可以在客户端调用它们的时候互不影响变化。子类算法之间是弱关联的关系,因而提高了软件的可扩展性与可重用性。
适合策略模式的情景如下:
- 上下文和具体策略是弱耦合关系
- 当增加新的具体策略时,不需要修改上下文类代码,上下文就可以引用新的具体策略的实例
策略模式各个角色具体描述如下所示:
- Strategy:抽象策略类
- ConcreteStrategy:具体策略类
- Context:上下文环境类,也就是下面例子的选择器类,它将抽象策略接口的引用作为成员变量,并通过该变量调用具体策略对象的相关方法完成所需功能。
例如,编制两个证书的加减乘除功能,采用策略模式编制的代码如下:
(1)抽象算法接口
public interface ICalc {
int calc(int a, int b);
}
(2)四个具体算法类
public class AddCalc implements ICalc{
@Override
public int calc(int a, int b) {
return a+b;
}
}
public class MinusCalc implements ICalc{
@Override
public int calc(int a, int b) {
return a-b;
}
}
public class MulCalc implements ICalc{
@Override
public int calc(int a, int b) {
return a*b;
}
}
public class DivCalc implements ICalc{
@Override
public int calc(int a, int b) {
return a/b;
}
}
(3)选择器功能
该类定义了抽象算法接口成员变量obj,它用于保存具体算法的引用。本类中calc() 方法仅起到转接作用,通过obj.calc() 调用具体算法完成相应功能。
public class Select {
private ICalc obj;
public Select(ICalc obj) {
this.obj = obj;
}
public int calc(int a, int b) {
return obj.calc(a, b);
}
}
(4)测试类
public class Test {
public static void main(String[] args) {
ICalc addCalc = new AddCalc();
ICalc mulCalc = new MulCalc();
Select obj = new Select(addCalc);
Select obj2 = new Select(mulCalc);
int result = obj.calc(3, 6);
int result2 = obj2.calc(3,6);
System.out.println(result);
System.out.println(result2);
}
}
结果:
9
18