首页 > 编程语言 >Java设计模式-策略模式

Java设计模式-策略模式

时间:2023-05-26 10:12:31浏览次数:55  
标签:Java 策略 模式 Strategy strategy 算法 设计模式 public

简介

在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。

策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。

实现

在Java编程语言中,实现策略模式需要以下几个关键元素:策略接口、具体策略类和环境类。

首先,定义一个策略接口,其中包含策略类共有的方法。例如:

public interface Strategy {
    void execute();
}

接下来,创建具体策略类,实现策略接口并实现具体的算法。例如:

public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        // 具体算法A的实现
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        // 具体算法B的实现
    }
}

然后,定义一个环境类,用于持有策略对象并在运行时切换不同的策略。例如:

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

通过以上实现,我们可以根据需要选择不同的具体策略类,并通过环境类进行调用。例如:

Strategy strategyA = new ConcreteStrategyA();
Context context = new Context(strategyA);
context.executeStrategy();

Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyB);
context.executeStrategy();

优缺点

优点

  1. 策略类之间相互独立,易于扩展和维护。
  2. 可以在运行时动态切换策略,灵活性高。
  3. 提供了一种可替代继承的方案,避免继承层次的臃肿。

缺点

  1. 客户端需要了解不同的策略类,增加了使用的复杂度。
  2. 策略模式增加了类的数量,可能会导致系统更加庞大。

运用场景

策略模式适用于以下场景:

  1. 需要在不同算法之间灵活切换的情况。
  2. 有多个类似的条件语句,可以使用策略模式提取出这些条件逻辑。
  3. 需要封装一些具体的算法,使其独立于客户端而变化。

总结

策略模式是一种灵活的行为型设计模式,通过封装不同的算法成为独立的策略类,使得这些算法可以在运行时相互替换。通过定义策略接口、具体策略类和环境类,我们可以在Java中实现策略模式。该模式具有灵活性高、易于扩展和维护等优点,适用于需要动态切换算法或封装具体算法的场景。然而,策略模式也需要客户端了解不同的策略类,增加了复杂度,并可能导致系统庞大。

总而言之,策略模式是一种强大而灵活的设计模式,可以提供可复用的算法解决方案。通过合理地应用策略模式,我们可以提高代码的灵活性、可扩展性和可维护性,从而更好地应对不同的业务需求。

img

标签:Java,策略,模式,Strategy,strategy,算法,设计模式,public
From: https://www.cnblogs.com/xstxjs/p/17433940.html

相关文章

  • javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满
    合集-easy-query(2) 1.献给转java的c#和java程序员的数据库orm框架05-222.javaer你还在手写分表分库?来看看这个框架怎么做的干货满满05-26收起 javaorm框架easy-query分库分表之分表高并发三驾马车:分库分表、MQ、缓存。今天给大家带来的就是分库分表的干......
  • JAVA使用HTTP代码示例
    以下是使用Java发送HTTP请求的示例代码:```javaimportjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;publicclassHttpExample{publicstaticvoidmain(String[]args){try{//创建URL对象URLurl=newU......
  • RHEL7-NAT模式连接外部网络
     通过VMware成功安装RHEL7服务器后,除了使用Bridge桥接模式连接外部网络外,还可以使用NAT模式连接外部网络前提:建议关闭防火墙及selinux。具体做法参考:https://blog.51cto.com/ztj1216/63445921.配置虚拟机RHEL7NAT模式连接外部网络1.1.设置虚拟机网络为NAT方式1.2. 查看Windows端......
  • javascript设计模式-享元
    这是一种优化性能代码的模式,最适合解决因创建大量类似对象而累及性能的问题。对于那些可能一连几天也不会重新加载的大型应用系统非常有用。它用于减少应用程序所需要数量,通过将对象内部划分为内在数据和外在数据两类来实现。管理享元外在数据有许多方法:1、数据库;2、组合模式(利用......
  • spring boot框架JAVA语言实现的货运系统(司机APP端+货主APP端)
    技术架构:springboot、mybatis、redis、vue、element-ui  开发语言:java、vue、uniapp开发工具:idea、vscode、hbuilder+  前端框架:vue  后端框架:springboot  数据库:mysql  移动端:uniapp混合开发+原生插件后台管理端功能:权限设置:角色设置、人员设置......
  • 什么是java序列化?什么情况下需要序列化?
    Java序列化是一种将对象转换为字节流的过程,使得对象可以在网络上传输或存储到文件系统中,同时也可以将字节流重新转换回对象的过程。通过序列化,可以将对象的状态保存下来,并在需要的时候恢复对象的状态。在Java中,通过实现Serializable接口,即可使一个类具备序列化的能力。序列化使用O......
  • 【深度剖析】JavaScript中块级作用域与函数作用域
    前言系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。面试官必问系列:深入理解JavaScript块和函数作用域在JavaScript中,究竟是什么会生成一个新的作用域,只有函数才会生成新的作用域吗?那JavaScript其他结构能生成新的作用域吗?3.1......
  • IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖)
    文章目录1.右键点击项目,创建一个普通的文件夹2.取名为lib3.把项目所需的jar包复制到lib文件夹下4.然后AddasLibrary…构建项目所需的jar包5.点击ok(完成jar包的自动依赖)1.右键点击项目,创建一个普通的文件夹2.取名为lib3.把项目所需的jar包复制到lib文件夹下4.然后Add......
  • java 阶乘实现
    importjava.text.SimpleDateFormat;importjava.util.Date;publicclassImoocStudent{publicstaticvoidmain(String[]args)throwsException{for(intcounter=0;counter<=10;counter++){//这里写法:把counter,factorial()对应放到......
  • laytpl( Layui 的一款轻量 JavaScript 模板引擎)
    laytpl 是Layui的一款轻量JavaScript模板引擎,在字符解析上有着比较出色的表现。laytpl是一款颠覆性的JavaScript模板引擎文档说明一、模版语法输出一个普通字段,不转义html:{{d.field}}输出一个普通字段,并转义html:{{=d.field}}JavaScript脚本:{{#JavaScriptstate......