模式设计图:
代码示例:
/**
* 首先定义一个策略接口,锦囊妙计的接口。
*/
public interface IStrategy {
//每个锦囊妙计都是一个可执行的算法。
public void operate();
}
/**
* 策略1
*/
public class Strategy1 implements IStrategy {
@Override
public void operate() {
System.out.println("策略1");
}
}
/**
* 策略2
*/
public class Strategy2 implements IStrategy {
@Override
public void operate() {
System.out.println("策略2");
}
}
/**
* 策略3
*/
public class Strategy3 implements IStrategy {
@Override
public void operate() {
System.out.println("策略3");
}
}
/**
* 定义一个锦囊用于存放妙计
*/
public class Context {
private IStrategy strategy;
//构造函数,要你使用哪个妙计
public Context(IStrategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
/**
* 使用锦囊妙计
*/
public class Main{
public static void main(String[] args) {
Context context;
context = new Context(new Strategy1());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
context = new Context(new Strategy2());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
context = new Context(new Strategy3());
context.operate();//拆开执行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。