方法器 --- 策略模式(Strategy Pattern)

1.这是我自己总结出来的,结合比较器。

如果函数有多个策略实现,可以用策略接口进行封装 ,如果函数有n个策略实现,那我们就创建n个继承策略接口的类,然后再进行重写。

例如:吃饭函数,可以用筷子吃,也可以用勺子吃,如果前期选择用筷子吃策略,后期想用勺子策略吃,就只能将筷子策略注释掉进行重写了,又或者前期引入if else 语句,但会导致不好维护。

java 复制代码
// 1. 定义策略接口
public interface Fun {
    public void function();
}

// 2. 具体策略实现
public class FunA implements Fun {
    public void function() {
        System.out.println("FunA具体实现");
    }
}

public class FunB implements Fun {
    public void function() {
        System.out.println("FunB具体实现");
    }
}

// 3. 上下文类使用策略
public class Main {
    public static void test(Fun f) {  // 接收接口类型,多态的体现
        f.function();
    }
    
    public static void main(String[] args) {
        test(new FunB());  // 使用策略B
        test(new FunA());  // 使用策略A
    }
}

2.更完整的例子:排序策略

java 复制代码
// 策略接口
interface SortStrategy {
    void sort(int[] array);
}

// 具体策略
class BubbleSort implements SortStrategy {
    public void sort(int[] array) {
        System.out.println("使用冒泡排序");
        // 实现冒泡排序算法
    }
}

class QuickSort implements SortStrategy {
    public void sort(int[] array) {
        System.out.println("使用快速排序");
        // 实现快速排序算法
    }
}

class MergeSort implements SortStrategy {
    public void sort(int[] array) {
        System.out.println("使用归并排序");
        // 实现归并排序算法
    }
}

// 上下文类
class Sorter {
    private SortStrategy strategy;
    
    public void setStrategy(SortStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void executeSort(int[] array) {
        strategy.sort(array);
    }
}

// 使用
public class Main {
    public static void main(String[] args) {
        Sorter sorter = new Sorter();
        int[] data = {5, 2, 8, 1, 9};
        
        // 动态切换策略
        sorter.setStrategy(new BubbleSort());
        sorter.executeSort(data);
        
        sorter.setStrategy(new QuickSort());
        sorter.executeSort(data);
    }
}
相关推荐
霸道流氓气质3 分钟前
LLM 应用限流与熔断机制完全指南:从多层防护架构到Java生产级弹性实战
java·开发语言·架构
不会就选b25 分钟前
算法日常・每日刷题--<动态规划>1
java·数据结构·算法
晚安code26 分钟前
JVM 内存结构入门:程序计数器、虚拟机栈、本地方法栈与堆的溢出诊断
java·jvm
自强的小白34 分钟前
Spring事务失效的场景
java·spring
小蒜学长41 分钟前
基于SpringBoot+Vue的小学数学智能出题系统(代码+数据库+LW)
java·数据库·spring boot·后端·智能出题系统
不灭的黄金瞳1231 小时前
Java继承与多态
java·intellij-idea
企业数字化笔记1 小时前
视频字幕如何烧录到成片?硬字幕、软字幕、样式控制与播放验收
java·ffmpeg
小朱爱编程1231 小时前
我用 Jev 做了三个实用工具:整理标签页、分诊飞书反馈、找回 GitHub 收藏
java·开发语言·人工智能·后端·python·架构·ai编程
酷虎软件1 小时前
视频加标题字幕 API 接口文档
java·数据库·mysql
谢亮_vipxieliang2 小时前
Java 8/11/17/21/25 怎么选?一篇讲清 LTS 升级路线
java·开发语言