设计模式-Strategy策略模式详解

简介: 设计模式-Strategy策略模式详解

策略模式是什么?


策略模式定义一系列算法,封装每个算法,并使他们可以互换,不同的策略可以让算法独立于使用它们的客户而变化。 以上定义来自设计模式之美



是不是很抽象,下面我们就用模拟Comparator接口为大家讲解策略模式,首先我定义一个Cat类,里面有weight,height,age 属性

public class Cat {
    int weight, height,age;
    public Cat(int weight, int height,int age) {
        this.weight = weight;
        this.height = height;
        this.age = age;
    }
    @Override
    public int compareTo(Cat c) {
        if(this.weight < c.weight) {
            return -1;
        } else if(this.weight > c.weight) {
            return 1;
        } else {
            return 0;
        }
    }
    @Override
    public String toString() {
        return "Cat{" +
            "weight=" + weight +
            ", height=" + height +
            ", age=" + age +
            '}';
    }
}
复制代码



现在我们要实现Cat类数组的排序,按weight属性升序,我们定义一个Sorter类,Cat类中定义compareTo方法,方法是按Cat类中的weight属性比较,我们通过选择排序实现Cat数组的排序

public class Sorter {
    public void sort(Cat[] arr) {
        //选择排序
        for(int i=0; i<arr.length - 1; i++) {
            int minPos = i;
            for(int j=i+1; j<arr.length; j++) {
                minPos = arr[j].compareTo(arr[minPos])==-1 ? j : minPos;
            }
            swap(arr, i, minPos);
        }
    }
    void swap(Cat[] arr, int i, int j) {
        Cat temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
     public static void main(String[] args) {
        Cat[] a = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};
        Sorter sorter = new Sorter();
        sorter.sort(a);
        System.out.println(Arrays.toString(a));
    }
}
复制代码



假如现在我们要实现Cat类heigt属性或age属性排序,我们是不是每次都要修改compareTo方法,在设计模式中,有个对修改关闭,对扩展开放的开闭原则,我们每次都去修改compareTo方法违背了设计模式的思想,我们怎么进行扩展,我们定义Comparator接口,我们要实现那个属性的排序,就定义哪个属性的比较器

public interface Comparator<T> {
    int compare(T o1, T o2);
}
复制代码



height升序属性的比较器

public class CatHeightComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        if(o1.height > o2.height) {
            return 1;
        } else if (o1.height < o2.height) {
            return -1;
        } else {
            return 0;
        }
    }
}
复制代码


public void sort(T[] arr, Comparator<T> comparator) {
    for(int i=0; i<arr.length - 1; i++) {
        int minPos = i;
        for(int j=i+1; j<arr.length; j++) {
            minPos = comparator.compare(arr[j],arr[minPos])==-1 ? j : minPos;
        }
        swap(arr, i, minPos);
    }
}
void swap(T[] arr, int i, int j) {
    T temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
public static void main(String[] args) {
    Cat[] a = {new Cat(3, 3, 3), new Cat(5, 5, 5), new Cat(1, 1, 1)};
    Sorter<Cat> sorter = new Sorter<>();
    sorter.sort(a,new CatHeightComparator());
    System.out.println(Arrays.toString(a));
}
复制代码



以此类推,我们要实现age属性的排序,我义Cat类age的比较器,要实现weight属性的排序,就实现Cat类weight比较器,以上就是Comparator接口实现策略模式的过程,我们可以提前的把这些比较器定义成枚举类,在程序初始化的时候将每个比较器放入常量map当中,想要那种比较器就从map中取,避免if...else...判断,增加一个策略,就在初始化了添加一个

public enum ComparatorEnum {
    AGE("age","age排序"),
    WEIGHT("weight","weight排序"),
    HEIGHT("height","height排序");
    private String code;
    private String desc;
    ComparatorEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    public String getCode() {
        return code;
    }
    public String getDesc() {
        return desc;
    }
}
复制代码


private static final Map<String, Comparator> comparatorMap= new HashMap<>(); 
  static { 
            shareStrategies.put("height", new CatHeightComparator()); 
            ...
            ...
  }
复制代码




策略模式优缺点


  • 优点
  1. 算法策略可以自由切换
  2. 避免使用多重条件转移语句,如if...else...语句、switch 语句
  3. 策略模式符合开闭原则




  • 缺点
  1. 必须知道所有的策略,并且自行决定使用哪一个策略类。
  2. 代码中会产生非常多策略类,增加维护难度。



相关文章
|
4月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
67 4
|
25天前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
58 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
3月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
4月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
61 1
|
4月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
61 2
|
4月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
61 2
|
5月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
57 3
|
5月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
46 2
|
5月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
|
5月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
38 0

热门文章

最新文章