博客
关于我
设计模式_行为型模式 -《策略模式》
阅读量:796 次
发布时间:2023-03-25

本文共 2378 字,大约阅读时间需要 7 分钟。

设计模式_行为型模式 - 策略模式

概述

策略模式(Strategy Pattern)是一种行为模式,旨在通过定义一系列算法并将每个算法封装,使其可以相互替换且变化不影响客户端使用。常见的应用场景包括选择出行方式或开发工具时的行为切换。

定义

策略模式通过将算法封装到独立的类中,使得算法的变化不会影响其使用者。其核心在于实现对算法的透明替换,符合“开闭原则”。

结构

策略模式的主要角色包括:

  • 抽象策略(Strategy):定义一个接口,提供统一的行为契合点。
  • 具体策略(Concrete Strategy):实现抽象策略的具体算法。
  • 环境(Context):持有策略类引用,决定使用哪种策略。
  • 案例实现

    促销活动案例

    百货公司在不同节日推出促销活动,使用策略模式来实现行为切换。

    // 抽象策略类
    public interface Strategy {
    void show();
    }
    // 具体策略类
    public class StrategyA implements Strategy {
    public void show() {
    System.out.println("买一送一");
    }
    }
    public class StrategyB implements Strategy {
    public void show() {
    System.out.println("满200元减50元");
    }
    }
    public class StrategyC implements Strategy {
    public void show() {
    System.out.println("满1000元加一元换购任意200元以下商品");
    }
    }
    // 环境类
    public class SalesMan {
    private Strategy strategy;
    public SalesMan(Strategy strategy) {
    this.strategy = strategy;
    }
    public void salesManShow() {
    strategy.show();
    }
    }
    // 测试类
    public class Client {
    public static void main(String[] args) {
    SalesMan salesMan = new SalesMan(new StrategyA());
    salesMan.salesManShow();
    salesMan.setStrategy(new StrategyB());
    salesMan.salesManShow();
    salesMan.setStrategy(new StrategyC());
    salesMan.salesManShow();
    }
    }

    排序案例

    Arrays类的sort方法使用策略模式实现排序逻辑。

    public class Arrays {
    public static
    void sort(T[] a, Comparator
    c) {
    if (c == null) {
    sort(a);
    } else {
    if (LegacyMergeSort.userRequested) {
    legacyMergeSort(a, c);
    } else {
    TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
    }
    }
    }

    优缺点

    优点

    • 灵活性:策略类可以自由切换,增加新策略无需修改代码。
    • 可读性:避免多重条件判断,代码更易理解。
    • 可扩展性:符合开闭原则,便于维护和扩展。

    缺点

    • 暴露性:所有策略类需对外暴露,客户端需了解所有策略。
    • 对象数量:策略模式可能导致大量策略类,影响性能。

    使用场景

    • 动态选择算法。
    • 算法独立且需隐藏实现细节。
    • 客户端不需了解算法内部逻辑。
    • 多个类区别仅在行为时。

    JDK源码解析-Comparator

    Arrays类的sort方法通过传递Comparator实现对数据的自定义排序。

    public class demo {
    public static void main(String[] args) {
    Integer[] data = {12, 2, 3, 2, 4, 5, 1};
    Arrays.sort(data, new Comparator
    () {
    public int compare(Integer o1, Integer o2) {
    return o2 - o1;
    }
    });
    System.out.println(Arrays.toString(data)); // [12, 5, 4, 3, 2, 2, 1]
    }
    }

    线程池的策略模式-拒绝策略

    在线程池管理中,策略模式用于决定如何处理任务提交和拒绝,确保系统高效稳定运行。

    转载地址:http://izhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现找到一个数字数组的中值算法(附完整源码)
    查看>>
    Objective-C实现找到具有 500 个除数的第一个三角形数算法(附完整源码)
    查看>>
    Objective-C实现找到最近的点对之间的距离算法(附完整源码)
    查看>>
    Objective-C实现抓包实例(附完整源码)
    查看>>
    Objective-C实现抽签抓阄(附完整源码)
    查看>>
    Objective-C实现抽象工厂模式(附完整源码)
    查看>>
    Objective-C实现拉格朗日插值法(附完整源码)
    查看>>
    Objective-C实现拷贝二进制文件(附完整源码)
    查看>>
    Objective-C实现指定内存空间获取时间的函数(附完整源码)
    查看>>
    Objective-C实现按位倒序(附完整源码)
    查看>>
    Objective-C实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
    查看>>
    Objective-C实现排队叫号系统(附完整源码)
    查看>>
    Objective-C实现控制NRP8S功率计读取功率 (附完整源码)
    查看>>
    Objective-C实现控制程控电源2306读取电流 (附完整源码)
    查看>>
    Objective-C实现摄氏温度和华氏温度互转(附完整源码)
    查看>>
    Objective-C实现播放器(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现操作注册表 (附完整源码)
    查看>>
    Objective-C实现改变图片亮度算法(附完整源码)
    查看>>
    Objective-C实现数字图像处理算法(附完整源码)
    查看>>