行为设计模式 -策略设计模式- JAVA

举报
神的孩子在歌唱 发表于 2024/09/29 23:16:24 2024/09/29
【摘要】 策略设计模式前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。作者:神的孩子都在歌唱一 .简介百度百科:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。个人理解: 要完成一件事情,你可以选择多种方式的时候。定义: 策略...

策略设计模式



前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱


一 .简介

百度百科:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。


个人理解: 要完成一件事情,你可以选择多种方式的时候。


定义策略设计模式是行为设计模式的一种。当我们对特定任务有多种算法并且客户端决定在运行时使用的实际实现时,使用策略模式。



策略模式的主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。

  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。



二. 案例

假设我们要去旅行(travel mode),出行的方式有很多种,可以坐高铁(railway),可以坐飞机(plane),那么我们就可以通过策略模式去实现出行的方式,让客户端去选择


image-20240605135228083

2.1 抽象策略(Strategy)类


/**
 * @author chenyunzhi
 * @date 2024/6/5 11:26
 * @Description 出行方式
 */
public interface Strategy {
    /**
     * 出行的方式
     */
    void way();
}


2.2 具体策略(Concrete Strategy)类

飞机

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:28
 * @Description 飞机
 */
public class Plane implements Strategy {
    @Override
    public void way() {
        System.out.println("飞机出行");
    }
}

铁路

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:27
 * @Description 铁路
 */
public class RailWay implements Strategy {
​
    @Override
    public void way() {
        System.out.println("高铁出行");
    }
}


2.3 环境(Context)类

用户连接上下文,给客户端调用的类

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:30
 * @Description 出行方式
 */
public class TravelMode {
​
    // 抽象策略角色的引用
    private final Strategy strategy;
​
    public TravelMode(Strategy strategy) {
        this.strategy = strategy;
    }
​
    // 客户使用的出行方式
    public void way() {
        strategy.way();
    }
}


2.4 测试


/**
 * @author chenyunzhi
 * @date 2024/6/5 11:29
 * @Description
 */
public class StrategyPatternTest {
    public static void main(String[] args) {
        // 飞机出行
        TravelMode travelMode = new TravelMode(new Plane());
        travelMode.way();
        // 高铁出行
        TravelMode travelMode1 = new TravelMode(new RailWay());
        travelMode1.way();
    }
}
​



image-20240605134710520


三. 结论

3.1 优缺点

1. 优点:

  • 策略类之间可以自由切换

    由于策略类都实现同一个接口,所以使它们之间可以自由切换。

  • 易于扩展

    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

2.缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。


3.2 使用场景

  • 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。

  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。

  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。

  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。

  • 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

  • 我们可以使用组合来为策略创建实例变量,但我们应该避免这种情况,因为我们希望将特定策略应用于特定任务。以比较器作为参数的 Collections.sort() 和 Arrays.sort() 方法也遵循相同的方法。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。