设计模式(二十二)策略模式

本文深入探讨了策略模式的概念,包括其动机、定义、结构和应用场景。通过对比硬编码方法,阐述了策略模式如何通过封装算法实现更好的灵活性和可扩展性。同时,文章提供了策略模式的实例代码,展示了如何在不同策略类间进行选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式动机

  • 为了完成某一项任务,往往有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
  • 在软件系统中,有许多算法可以实现某一功能,如查找,排序等,一种常用的方法是硬编码,就是在一个类中提供多个方法,每一个方法对应一个具体的查找算法,也可以将这些查找算法封装在一个统一的方法中,通过if。。else。。等条件判断语句来进行选择。这两种实现方法我们称之为硬编码。这种方式若要增加一种新的查找算法,需要修改源代码。维护起来非常麻烦。

模式定义

  • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让他们可以互相替换,策略模式让算法独立于它的客户而变化。是一种对象行为型模式。

模式结构

在这里插入图片描述

  • Context:环境类
  • Strategy:抽象策略类
  • ConcreteStrategy:具体策略类

模式分析

  • 这个模式是一个很容易理解和使用的模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里边,作为一个抽象策略类的子类。
  • 这个模式中,由客户端自己决定在什么情况下使用什么具体策略角色。

模式实例

  • 有三个排序算法,客户端可以随便选择一个算法对一组数排序。
    在这里插入图片描述
public class ArrayHandler {
    private Sort sort;

    public void setSort(Sort sort) {
        this.sort = sort;
    }
    public void sort(int []arry){
        sort.sort(arry);
    }
}
public interface Sort {
    void sort(int[] arr);
}
class BubbleSort implements Sort{

    @Override
    //这里没有实现具体的排序算法
    public void sort(int[] arr) {
        
    }
}
class InsertionSort implements Sort{

    @Override
    public void sort(int[] arr) {
        
    }
}
class SelectionSort implements Sort{

    @Override
    public void sort(int[] arr) {
        
    }
}
  • 上边的代码并没有实现具体的排序方法,这里由于时间紧迫只是做了一个大致结构。

模式优缺点

  • 优点
    • 对开闭原则完美支持。
    • 提供了可以替换继承关系的办法
  • 缺点
    • 客户端必须知道所有的策略类,并自行决定使用哪一种。
    • 策略模式将产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

模式适用环境和应用

  • 适用环境
    • 一个体系需要动态的在几种算法中选择一种
    • 不希望客户端知道复杂的,与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性
  • 应用
    • Java SE的容器布局管理就是策略模式的一个经典实例。

策略模式与状态模式的区别

  • 使用策略模式时,客户端无需知道所选的具体策略是哪一个,而使用状态模式时,客户端无需关系具体状态,环境类的状态会根据用户的操作自动更换。
  • 如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些状态之间可以发生转换时使用状态模式;如果系统中某一行为存在多种实现方式,而且这些实现方式可以互换时使用策略模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值