策略模式- 2020-11-14 20:59- 设计模式: 设计模式,策略模式


定义

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

名词解析

算法

乍一看 算法 这个说法有点让人难以理解,其实可以将算法看作是一系列的策略,在使用策略模式时,指定具体想要的策略模式。

DOME

通过给动物排序,可以按照重量排序,也可以按照高度排序,可以给猫狗排序,也可以给其他动物排序

实体类 :Dog Cat

  1. import lombok.Data;
  2. /**
  3. * 猫类
  4. *
  5. * @Author Bai
  6. * @Date 2020-11-14 18:33
  7. */
  8. @Data
  9. public class Cat {
  10. /**
  11. * 猫的重量
  12. */
  13. private Integer weight;
  14. /**
  15. * 猫的长度
  16. */
  17. private Integer high;
  18. public Cat(Integer weight, Integer high) {
  19. this.weight = weight;
  20. this.high = high;
  21. }
  22. @Override
  23. public String toString() {
  24. return "Cat{" +
  25. "weight=" + weight +
  26. ", high=" + high +
  27. '}';
  28. }
  29. }
  1. import lombok.Data;
  2. /**
  3. * 狗类
  4. *
  5. * @author Bai
  6. * @date 2020/11/14 18:47
  7. */
  8. @Data
  9. public class Dog {
  10. /**
  11. * 重量
  12. */
  13. private Integer weight;
  14. public Dog(Integer weight) {
  15. this.weight = weight;
  16. }
  17. }

比较器:Comparator

  1. /**
  2. * 比较器
  3. * @Author Bai
  4. * @Date 2020-11-14 18:33
  5. */
  6. public interface Comparator<T> {
  7. /**
  8. * 比较两者大小
  9. *
  10. * @param o1
  11. * @param o2
  12. * @return
  13. */
  14. int compare(T o1, T o2);
  15. }

具体比较器(也可以理解为算法):

CatWeightComparator
CatHighComparator
DogWeightComparator

  1. package com.xy.blog.test.designpatterns.strategy;
  2. /**
  3. * 猫重量比较器
  4. *
  5. * @Author Bai
  6. * @Date 2020-11-14 18:33
  7. */
  8. public class CatWeightComparator implements Comparator<Cat> {
  9. @Override
  10. public int compare(Cat o1, Cat o2) {
  11. if (o1.getWeight() < o2.getWeight()) {
  12. return -1;
  13. }
  14. if (o1.getWeight() > o2.getWeight()) {
  15. return 1;
  16. }
  17. return 0;
  18. }
  19. }

  1. /**
  2. * 猫高度比较器
  3. *
  4. * @author Bai
  5. * @date 2020-11-14 18:33
  6. */
  7. public class CatHighComparator implements Comparator<Cat> {
  8. @Override
  9. public int compare(Cat o1, Cat o2) {
  10. if (o1.getHigh() < o2.getHigh()) {
  11. return -1;
  12. }
  13. if (o1.getHigh() > o2.getHigh()) {
  14. return 1;
  15. }
  16. return 0;
  17. }
  18. }

  1. /**
  2. * 猫重量比较器
  3. *
  4. * @Author Bai
  5. * @Date 2020-11-14 18:33
  6. */
  7. public class DogWeightComparator implements Comparator<Dog> {
  8. @Override
  9. public int compare(Dog o1, Dog o2) {
  10. if (o1.getWeight() < o2.getWeight()) {
  11. return -1;
  12. }
  13. if (o1.getWeight() > o2.getWeight()) {
  14. return 1;
  15. }
  16. return 0;
  17. }
  18. }

排序:Sort

  1. package com.xy.blog.test.designpatterns.strategy;
  2. import com.google.common.collect.Lists;
  3. import java.util.List;
  4. /**
  5. * 排序
  6. *
  7. * @Author Bai
  8. * @Date 2020-11-14 18:33
  9. */
  10. public class Sort<T> {
  11. public void sort(List<T> os, Comparator<T> comparator) {
  12. // 对 arr 进行拷贝,不改变参数内容
  13. for (int i = 1; i < os.size(); i++) {
  14. // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
  15. boolean flag = true;
  16. for (int j = 0; j < os.size() - i; j++) {
  17. if (comparator.compare(os.get(j), os.get(j + 1)) > 0) {
  18. T tmp = os.get(j);
  19. os.set(j, os.get(j + 1));
  20. os.set(j + 1, tmp);
  21. flag = false;
  22. }
  23. }
  24. if (flag) {
  25. break;
  26. }
  27. }
  28. }
  29. public static void main(String[] args) {
  30. List<Cat> cats = Lists.newArrayList(new Cat(16, 10), new Cat(2, 2), new Cat(14, 20));
  31. Sort<Cat> sort = new Sort<>();
  32. sort.sort(cats, new CatWeightComparator());
  33. System.out.println(cats);
  34. sort.sort(cats, new CatHighComparator());
  35. System.out.println(cats);
  36. List<Dog> dogs = Lists.newArrayList(new Dog(16), new Dog(2), new Dog(14));
  37. Sort<Dog> dogSort = new Sort<>();
  38. dogSort.sort(dogs, new DogWeightComparator());
  39. System.out.println(dogs);
  40. }
  41. }

好处TODO

开闭原则

坏处TODO

使用者需要了解每种算法,并且找到适合自己的算法。

spring中使用或是项目中使用TODO**