• 面向对象开发技术设计模式的选择


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 超级七七o 2024-06-26 19:50 采纳率: 33.3% 浏览 3 首页/ 设计模式 / 面向对象开发技术设计模式的选择 单例模式观察者模式适配器模式 给出了多个设计模式以及三个情景描述,分析情景选择正确的设计模式 已有快速排序类和二分查找类,现希望利用这两个类实现通用接口排序和查找。不同的打印者需要打印打印池中的打印任务。毛笔有大中小三种类型,有12种颜料。 已知创建型模式有:简单工厂、工厂方法、单例模式已知结构型模式有:桥模式、装饰者模式、适配器模式已知行为型模式有:策略模式、观察者模式 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 邓瑞军说HelloWorld 智能终端待机状态检测方法及装置专利发明者 2024-06-26 20:02
      关注

      根据情景描述,可以对每个情景选择最合适的设计模式:

      1. 已有快速排序类和二分查找类,现希望利用这两个类实现通用接口排序和查找:

        策略模式(行为型模式)最为适合。

        • 理由:策略模式允许定义一系列算法,将每个算法封装起来,并使它们可以互相替换。可以定义一个通用接口来表示排序和查找操作,然后将快速排序和二分查找的具体实现类作为策略实现。
      2. 不同的打印者需要打印打印池中的打印任务:

        观察者模式(行为型模式)适合。

        • 理由:观察者模式定义了对象间的一对多依赖关系,使得每当一个对象改变状态时,其相关依赖对象都会收到通知并自动更新。在这个情景中,打印池是被观察者,不同的打印者是观察者。打印池中的打印任务变化时,可以通知各个打印者。
      3. 毛笔有大中小三种类型,有12种颜料:

        桥模式(结构型模式)适合。

        • 理由:桥模式将抽象部分与实现部分分离,使它们可以独立变化。在这个情景中,毛笔的类型和颜料是两个独立的维度,使用桥模式可以分别处理毛笔的类型和颜料的组合,以避免类的爆炸式增长。

      总结如下:

      1. 快速排序和二分查找实现通用接口:策略模式
      2. 不同的打印者打印打印任务:观察者模式
      3. 毛笔和颜料组合:桥模式
      评论
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-26 19:50
      关注

      引自免费微信小程序:皆我百晓生

      在解决这个问题时,我们需要考虑如何将两个类(快速排序类和二分查找类)整合到一个通用接口上,并且要确保这些操作可以被其他类型的打印者所调用。此外,我们还需要考虑到毛笔和颜料之间的关系,以及它们是否应该通过相同的接口进行处理。

      首先,让我们确定每个场景的具体需求:

      • 情景一:快速排序和二分查找的通用接口。
      • 情景二:毛笔和颜料的通用接口。
      • 情景三:不同打印者的通用接口。

      接下来,我们将根据这些需求选择合适的设计模式:

      通用接口

      为了使快速排序和二分查找类能够在统一的接口上调用,我们可以使用单一职责原则(Single Responsibility Principle)。这个原则要求每个类只负责一个特定的责任,即单一功能。

      示例代码

      public interface Sorter {
          void sort(int[] arr);
      }
      
      public class QuickSort implements Sorter {
          @Override
          public void sort(int[] arr) {
              quicksort(arr, 0, arr.length - 1);
          }
      
          private static void quicksort(int[] arr, int low, int high) {
              if (low < high) {
                  int pivotIndex = partition(arr, low, high);
                  quicksort(arr, low, pivotIndex - 1); // 左子树
                  quicksort(arr, pivotIndex + 1, high); // 右子树
              }
          }
      
          private static int partition(int[] arr, int low, int high) {
              int pivot = arr[high];
              int i = low - 1;
              for (int j = low; j <= high - 1; j++) {
                  if (arr[j] < pivot) {
                      i++;
                      swap(arr, i, j);
                  }
              }
              swap(arr, i + 1, high);
              return i + 1;
          }
      
          private static void swap(int[] arr, int i, int j) {
              int temp = arr[i];
              arr[i] = arr[j];
              arr[j] = temp;
          }
      }
      

      类的复用性

      这种方式使得快速排序和二分查找类可以独立于任何具体实现而存在,这提高了他们的复用性和可扩展性。

      毛笔和颜料的通用接口

      对于毛笔和颜料的通用接口,我们同样遵循单一职责的原则。这里的关键在于提供一个接口,让不同的打印者可以根据需要实现其特定的功能。

      示例代码

      public interface Painter {
          void paint(String color);
      }
      
      public class BrushPainter implements Painter {
          private String brushType;
      
          public BrushPainter(String brushType) {
              this.brushType = brushType;
          }
      
          @Override
          public void paint(String color) {
              System.out.println("Painting with " + brushType + " and " + color);
          }
      }
      

      类的复用性

      通过这样的方式,每个打印者都可以根据需要定制其使用的毛笔和颜料。

      不同打印者的通用接口

      在这个部分,我们仍然采用单一职责原则,为每个打印者提供一个接口,允许他们使用相同的通用算法。

      示例代码

      public interface Printer {
          void print(Painter painter);
      }
      
      public class PdfPrinter implements Printer {
          @Override
          public void print(Painter painter) {
              painter.paint(painters.getColor());
          }
      
          private static String printersColor[] = {"Red", "Blue", "Green"};
      
          private static String getColor() {
              int index = random.nextInt(printersColor.length);
              return printersColor[index];
          }
      }
      
      class Painters {
          private static final Map colors = new HashMap<>();
          static {
              colors.put("Red", "Red");
              colors.put("Blue", "Blue");
              colors.put("Green", "Green");
          }
      
          private Painters() {}
      
          public static String getColor() {
              return colors.get(Thread.currentThread().getName());
          }
      }
      

      总结

      通过上述步骤,我们成功地构建了一个通用接口,实现了对快速排序、二分查找和其他功能的调用。同时,我们也保证了每个接口的单一职责,从而提高了系统的模块化和灵活性。这种方法不仅适用于单一功能,也适用于多层嵌套的功能,体现了设计模式的核心思想——解耦合、提高可维护性和扩展性。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    基于SSM的甜品店商城系统
    时序违例的解决方法
    如何根据元素的位置关系来调整 CSS 样式
    数据结构-堆的实现及应用(堆排序和TOP-K问题)
    Java项目中排查JVM问题的思路
    [附源码]计算机毕业设计校园租赁系统Springboot程序
    Spring Security整体架构
    Docker系列--在容器中安装JDK的方法(有示例)
    element关于form表单其他参数+upload文件 一起提交
    01-Sentinel与spring-cloud的整合
  • 原文地址:https://ask.csdn.net/questions/8124427