策略模式是一种行为型设计模式,它允许在运行时根据需要动态选择算法的行为。
1. 定义
策略模式(Strategy Pattern)定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。
2.构成
(1)抽象策略角色(Strategy):通常由一个接口或抽象类实现,定义了一系列算法的公共接口。
(2)具体策略角色(ConcreteStrategy):实现了抽象策略角色定义的接口,提供了具体的算法实现。
(3)环境角色(Context):持有一个策略类的引用,负责和具体的策略类交互,通常具有一个方法来执行当前策略。
3. 应用场景
当需要在不同情况下使用不同的策略,或者策略可能在未来会有其他实现方式时,策略模式非常有用。
策略模式也用于对客户隐藏具体策略(算法)的实现细节,使得各种策略之间完全独立。
4. 优点
管理算法族:策略模式提供了一种管理多种相关算法的方法,通过继承可以共享公共的代码,避免重复。
替换继承:策略模式提供了替换继承关系的方法,使得算法或行为的使用者与算法或行为本身分离,从而可以独立地演化。
避免多重条件语句:使用策略模式可以避免使用难以维护的多重条件转移语句。
5. 缺点
客户端需知悉策略:客户端必须知道所有的策略类,并决定使用哪一个,这要求客户端对算法或行为有一定的了解。
类数量增加:策略模式可能导致产生大量的策略类,每个具体策略都会产生一个新类。
6.代码示例
抽象策略角色:
public interface Strategy{
void execute(String mes);
}
具体策略角色:
public class StrategyA implements Strategy{
@Override
public void execute(String mes){
System.out.println(mes)
}
}
public class StrategyB implements Strategy{
@Override
public void execute(String mes){
System.out.println(mes)
}
}
环境角色:
public class Context{
private Strategy strategy;
Context(Strategy strategy){
this.strategy = strategy;
}
public void execute(String mes){
this.strategy.execute(mes);
}
}
使用:
public class Main{
public static void main(String[] args){
Context context = new Context(new StrategyA());
context.execute("this is strategy A");
context = new Context(new StrategyB());
context.execute("this is strategy B");
}
}
在策略模式中,决定参数应该如何传入取决于具体的情况和需求。一般来说,参数应该由新建策略对象时通过构造函数传入,这样可以确保在创建策略对象时就确定了相关参数,提高了策略对象的独立性和灵活性。
然而,在某些情况下,如果参数是在执行策略时才确定的,那么可以通过调用context的执行方法时传入参数。这种情况下,可能需要在context中存储参数,并在执行策略时将参数传递给具体的策略对象。