设计模式之策略模式

谈一谈策略模式

      • 1. 什么是策略模式
      • 2. 设计原则
      • 3. 使用场景
      • 4. 代码实现(诸葛亮的锦囊妙计,每一个锦囊就是一个策略。)
      • 5. 优缺点及总结

1. 什么是策略模式

定义算法族,分别封装起来,使他们之间可以相互替换

2. 设计原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程

3. 使用场景

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
  • 需要安全地封装多种同一类型的操作时;
  • 出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

4. 代码实现(诸葛亮的锦囊妙计,每一个锦囊就是一个策略。)

UML类图:
设计模式之策略模式_第1张图片
算法(妙计)接口:

public interface IStrategy {

    //每个锦囊妙计都是一个可执行的算法
    public void operate();
}

算法(妙计)类

public class BackDoor implements IStrategy {
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}
public class GivenGreenLight implements IStrategy {
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");
    }
}
public class BlockEnemy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}

锦囊类

public class Context {
    //构造函数,你要使用那个妙计
    private IStrategy straegy;
    public Context(IStrategy strategy){
        this.straegy = strategy;
    }

    //使用计谋了,看我出招了
    public void operate(){
        this.straegy.operate();
    }
}

具体的使用类(赵云)

public class ZhaoYun {
    public static void main(String[] args) {
        Context context;
        context = new Context(new BackDoor());
        // 第一个妙计
        context.operate();
        // 第二个妙计
        context = new Context(new GivenGreenLight());
        context.operate();
        // 第三个妙计
        context = new Context(new BlockEnemy());
        context.operate();
    }
}

5. 优缺点及总结

优点:

  • 算法(锦囊)可自由切换
  • 避免了多重条件判断(if else和switch)
  • 扩展性良好

缺点:

  • 可维护性差(随着策略类的增多变得难以维护)
  • 使用者必须了解所有算法的区别及使用场景

总结:


2019.7.13
与Collection的sort方法和Arrays的sort方法传入相应的comparator作为参数的道理十分相似,传入相应的排序策略达到排序目的,使用者了解自己传入的comparator参数的作用,很能体现策略模式的思想。

欢迎指正~~~

引用:设计模式之禅
引用:http://ifeve.com/strategy-design-pattern-in-java-example-tutorial/

你可能感兴趣的:(设计模式,策略模式)