策略模式:定义了一组算法,将每个算法都封装起来,并且使他们之间可以互换。策略模式让算法的变化独立于使用算法的客户,它是一种行为模式。
策略模式UML类图如下:
从UML类图可以看出,策略模式包含3个元素:
环境(Context):持有一个抽象策略的引用。
抽象策略(Strategy):给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy):包装了相关的算法或行为。
抽象策略代码:
package com.szcatic.strategy;
public interface IStrategy {
void doSomething();
}
具体策略代码:
package com.szcatic.strategy;
public class ConcreteStrategy1 implements IStrategy {
@Override
public void doSomething() {
System.out.println("唱歌");
}
}
package com.szcatic.strategy;
public class ConcreteStrategy2 implements IStrategy {
@Override
public void doSomething() {
System.out.println("吃饭");
}
}
环境类代码:
package com.szcatic.strategy;
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public void execute() {
strategy.doSomething();
}
}
测试类代码:
package com.szcatic.test.strategy;
import org.junit.jupiter.api.Test;
import com.szcatic.strategy.ConcreteStrategy1;
import com.szcatic.strategy.ConcreteStrategy2;
import com.szcatic.strategy.Context;
import com.szcatic.strategy.IStrategy;
public class StrategyTest {
@Test
void test() {
IStrategy strategy = new ConcreteStrategy1();
Context context = new Context(strategy);
context.execute();
strategy = new ConcreteStrategy2();
context = new Context(strategy);
context.execute();
}
}
输出结果:
唱歌
吃饭
总结
优点:
1.算法可以自由切换。
2.避免使用多重条件判断。
3.扩展性良好。
缺点:
1.策略类会增多。
2.所有策略类都需要对外暴露。