【设计模式-02】Strategy策略模式及应用场景

这篇具有很好参考价值的文章主要介绍了【设计模式-02】Strategy策略模式及应用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、参考资料

  • Java 官方文档

Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html

  • Java中使用到的策略模式

Comparator、comparable

Comparator (Java SE 18 & JDK 18)declaration: module: java.base, package: java.util, interface: Comparatorhttps://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/Comparator.html

Comparable (Java SE 18 & JDK 18)declaration: module: java.base, package: java.lang, interface: Comparablehttps://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/lang/Comparable.html

二、主要设计思想

对更改关闭,对扩展开放,程序更有弹性,可扩展性强。

Extensibility、Scalability

三、应用场景

对任意数据类型的数组进行排序,如对int、double、float以及对象的排序。

1、Cat.java 对象

/**
 * @description: 猫对象
 * @author: flygo
 * @time: 2022/7/4 11:11
 */
public class Cat {

  private int height, weight;

  public Cat() {}

  public Cat(int weight, int height) {
    this.weight = weight;
    this.height = height;
  }

  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{" + "height=" + height + ", weight=" + weight + '}';
  }
}

2、Sorter.java 排序类

/**
 * @description: 排序对象
 * @author: flygo
 * @time: 2022/7/4 11:16
 */
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);
    }
  }

  static void swap(Cat[] arr, int i, int j) {
    Cat temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

3、StrategyMain 主类

import java.util.Arrays;

/**
 * @description: 主方法
 * @author: flygo
 * @time: 2022/7/4 11:15
 */
public class StrategyMain {

  public static void main(String[] args) {
    //    int[] arr = {2, 4, 3, 6, 10, 1};

    Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};
    Sorter sorter = new Sorter();
    sorter.sort(arr);

    System.out.println(Arrays.toString(arr));
  }
}

四、使用泛型调整修改

1、定义Comparable接口

注意接口中使用了泛型 <T>,定义了compareTo接口方法。

/**
 * @description: 比较接口类
 * @author: flygo
 * @time: 2022/7/4 15:46
 */
public interface Comparable<T> {

  int compareTo(T o);
}

2、Sorter 排序类

使用Comparable 接口类承接对象数组,只要实现了Comparable接口中compareTo方法,都可以进行排序。

/**
 * @description: 排序对象
 * @author: flygo
 * @time: 2022/7/4 11:16
 */
public class Sorter {

  public void sort(Comparable[] 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);
    }
  }

  static void swap(Comparable[] arr, int i, int j) {
    Comparable temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

3、定义一个需要排序的对象,如Dog

Dog对象实现 Comparable 接口类中的 compareTo 方法

/**
 * @description: 狗
 * @author: flygo
 * @time: 2022/7/4 15:48
 */
public class Dog implements Comparable<Dog> {

  int food;

  public Dog(int food) {
    this.food = food;
  }

  @Override
  public int compareTo(Dog o) {
    if (this.food < o.food) return -1;
    else if (this.food > o.food) return 1;
    else return 0;
  }

  @Override
  public String toString() {
    return "Dog{" + "food=" + food + '}';
  }
}

4、最终效果

最终可以实现对实现Comparable 接口compareTo方法的任意对象进行排序

import java.util.Arrays;

/**
 * @description: 主方法
 * @author: flygo
 * @time: 2022/7/4 11:15
 */
public class StrategyMain {

  public static void main(String[] args) {
    //    int[] arr = {2, 4, 3, 6, 10, 1};
    //    Cat[] arr = {new Cat(3, 3), new Cat(5, 5), new Cat(1, 1)};

    Dog[] arr = {new Dog(5), new Dog(1), new Dog(3)};

    Sorter sorter = new Sorter();
    sorter.sort(arr);

    System.out.println(Arrays.toString(arr));
  }
}

五、源码地址

GitHub - jxaufang168/Design-Patterns: 设计模式学习设计模式学习. Contribute to jxaufang168/Design-Patterns development by creating an account on GitHub.https://github.com/jxaufang168/Design-Patterns



 文章来源地址https://www.toymoban.com/news/detail-792567.html

到了这里,关于【设计模式-02】Strategy策略模式及应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式—策略模式(Strategy Mode)

    目录 前言 一、策略模式的简介 二、策略模式的概念 三、策略模式的作用 四、策略模式的优、缺点 策略模式的优点: 策略模式的缺点: 五、策略模式应用场景 六、代码案例 1)抽象接口类 2)具体的策略类:减 3)具体策略类:打折 4)上下文类 5)客户端Main代码测试 总结

    2024年02月08日
    浏览(33)
  • 大话设计模式——18.策略模式(Strategy Pattern)

    简介 是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。 UML图 应用场景 Java AWT中的LayoutManager(布局管理器) 系统中存在多个类,它们的区别仅在于它们的行为 不希望暴露

    2024年04月13日
    浏览(35)
  • C++设计模式_04_Strategy 策略模式

    接上篇,本篇将会介绍C++设计模式中的 Strategy 策略模式 ,和上篇 模板方法Template Method 一样,仍属于“组件协作”模式,它与Template Method有着异曲同工之妙。 在软件构建过程中,某些对象使用的算法可能多种多样ÿ

    2024年02月09日
    浏览(31)
  • 设计模式二十二:策略模式(Strategy Pattern)

    定义一系列算法,将每个算法封装成独立的对象,并使这些对象可互相替换。这使得在运行时可以动态地选择算法,而不必改变使用算法的客户端代码。策略模式的主要目标是将算法的定义与使用分离,使得客户端可以根据需要灵活地选择和切换不同的算法,而不影响到客户

    2024年02月11日
    浏览(25)
  • 实际开发中常用的设计模式--------策略模式(知识跟业务场景结合)-----小白也能看懂(通俗易懂版本)

    1.策略模式定义: 策略模式是一种行为型设计模式,它允许在运行时动态地改变对象的行为。策略模式将将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换从而使得算法的变化不会影响到客户端 2.简单的策略模式示例代码: 在上述代码中,SortStra

    2024年02月13日
    浏览(40)
  • 设计模式应用场景

    工厂模式(Factory Pattern):使用工厂方法创建对象,而不是使用new直接实例化对象。 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关对象的接口,而无需指定它们的具体类。 单例模式(Singleton Pattern):限制一个类只能有一个实例并提供一个全局访问点

    2024年02月09日
    浏览(23)
  • 策略模式,一种广泛应用于各种情况的设计模式(设计模式与开发实践 P5)

    定义:定义一系列算法,把它们一个个封装起来,并且可以互相替换 例如,我们要计算年终奖,年终奖根据绩效 A、B、C 来计算最终数值 最初我们很容易想到用 分支 if 来解决这个问题,如果绩效 = A 则工资 x 2,如果绩效 = B 则工资 x 3 如果经常使用这样的分支结构,你会发现

    2024年02月07日
    浏览(32)
  • 前端的23种设计模式及应用场景

    设计模式是在软件开发中经过验证的解决问题的方法。它们是从经验中总结出来的,可以帮助我们更好地组织和管理代码,提高代码的可维护性、可扩展性和可重用性。无论是前端还是后端开发,设计模式都扮演着重要的角色。在本专栏中,我们将探索一些常见的前端设计模

    2024年02月20日
    浏览(26)
  • GOF 23 种设计模式应用场景分析

    本文看下GOF 23 种设计模式应用场景,详细的还是通过文章给出参考链接学习下。 参考这篇文章 。 有几种产品需要创建,比如创建红苹果,青苹果,绿苹果,这些对象通过一个对象就可以。 参考这篇文章 。 有几种产品需要创建,但是每种产品不能简单的通过一个对象来表示

    2024年02月16日
    浏览(35)
  • 23种设计模式-备忘录模式(Android应用场景介绍)

    备忘录模式 是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 备忘录模式通常包括三个角色:原发器(Originator)、备忘录(Memento)和负责人(Caretaker)。原发

    2023年04月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包