1 介绍
Strategy模式是行为模式的一种,主要是对一系列算法的封装,为所有算法定义一个抽象的算法接口,并通过继承抽象算法接口对所有的算法加以封装和实现,而具体的算法调用交给用户。
那么问题来了,作为一个学生,我们每天都要上课,上课的地点都在同一个教室,但是课本却不是同一本。上课了,我们要怎么选择课本呢?
2 实现方式
2.1 传统方式
<!--核心代码--!>
public String lesson(String course){
if("英语".equals(course)){
return "英语课本";
}else if("数学".equals(course)){
return "数学课本";
}else if("语文".equals(course)){
return "语文课本";
}else if("思政".equals(course)){
return "思政课本";
}
return null;
}
当课程每增加一门,我们都需要追加一个if...else...
,这样使的整个程序代码过于累赘,逻辑也变的复杂化,增加了开发人员的维护成本。
2.2 策略模式
策略模式的几个角色:
- Strategy:策略抽象
- ConcreteStrategy : 各种策略的具体实现
- Context:策略的外部封装类,根据不同的策略执行不同的方法。
实现方式:
策略抽象:Strategy.class
public interface Strategy {
public void lesson();
}
策略具体实现:MathStrategy.class / EnglishStrategy.class
public class MathStrategy implements Strategy{
@Override
public void lesson() {
System.out.println("数学课本");
}
}
public class EnglishStrategy implements Strategy{
@Override
public void lesson() {
System.out.println("英语课本");
}
}
外部封装类:Context.class
public class Context implements Strategy{
private Strategy strategy;
<!--传入一个具体的策略实现--!>
public Context(Strategy strategy) {
this.strategy = strategy;
}
@Override
public void lesson() {
this.strategy.lesson();
}
}
MainClass.class
public class MainClass {
public static void main(String[] args) {
<!--创建需要使用的策略对象--!>
Strategy strategy = new Context(new MathStrategy());
strategy.lesson();
}
}
当我们需要添加一个新的课程实现(具体策略)时,我们只需要编写一个子类实现Strategy
并编写具体的实现方法即可,这样使得每个具体策略都独立起来,相互之间不存在依赖关系,整个程序结构也变的更加灵活,具有更好的维护性和拓展性,使开发人员可以更好的组织、调用。
3 优缺点
优点
- 使用策略模式可以避免多次的使用
if...else...
的多重判断语句,多重判断语句不利于后期的维护和拓展。 - 策略模式将公共的代码都转移到父类中,从而省去了大量的重复代码。
缺点
- 用户必须知道所有的策略类,并自行去选择适合的算法或行为。
喜欢的话戳一下喜欢呗。