1.概念
其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
2.组成
a.抽象策略角色 -----------这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们的Comparator接口。
b具体策略角色 ----------- 包装了具体的算法和行为。对比来说,就是实现了Comparator接口的实现一组实现类。
3.环境角色 -----------------内部会持有一个抽象角色的引用,给客户端调用。对比来说,就是我们的TreeSet类。说明:TreeSet内部一定会有一个策略类的一个成员变量,这样做的目的在于可以当我们在去创建TreeSet对象的时候,可以接收我们向TreeSet类中传递的具体的策略类。
步骤:
➀写策略接口
public interface Strategy {
int calNum(int n1,int n2);
}
➁写具体的策略,这里有两个具体的策略类AddStrategy和SubStrategy.
public class AddStrategy implements Strategy{
@Override
public int calNum(int n1, int n2) {
return n1+n2;
}
}
public class SubStrategy implements Strategy{
@Override
public int calNum(int n1, int n2) {
return n1-n2;
}
}
③环境类
public class Enviroment {
private Strategy strategy;
public Enviroment(Strategy strategy) {
super();
this.strategy = strategy;
}
public int calulate(int n1, int n2) {
return strategy.calNum(n1, n2);
}
}
④编写测试类
public class TestStrategy {
public static void main(String[] args) {
System.out.println("AddStrategy策略下的结果----" + new Enviroment(new AddStrategy()).calulate(10, 2));
System.out.println("SubStrategy策略下的结果----" + new Enviroment(new SubStrategy()).calulate(10, 2));
}
}
⑤测试结果如图
总结
在于策略模式把每一种具体的策略都封装成一个实现类,如果策略有很多的话,很显然是实现类就会导致过多,显得臃肿。其实每种设计模式都有它各种的优缺点,在这里呢,我们就要具体情况具体分析了