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

Java设计模式-策略模式详解

时间:2023-12-01 18:12:55浏览次数:45  
标签:Java 策略 void 接口 Strategy 详解 支付 设计模式 public

1.策略模式基本了解

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一组可以相互替换的算法,使得客户端可以根据不同的需求选择不同的算法,将对象和行为分开。

在策略模式中,我们创建了一个策略接口,该接口定义了所有必需的方法。然后,我们创建了实现了该策略接口的具体策略类。最后,客户端代码在运行时根据需求选择不同的策略。

策略模式的主要优点是它使得算法可以自由切换,避免了使用多重条件语句判断,提高了代码的可维护性和扩展性。缺点是随着策略的增多,所有策略类都需要对外暴露,这可能导致客户端代码过于复杂。

if-else也可以实现,但是我们最终的目的不就是为了可维护性高,以及装逼嘛(开个玩笑),毕竟很多Java的框架源代码都用到了这种模式,了解之后有助于学习这些框架。

2.三要素

  • 策略接口:策略接口定义了所有具体策略类必须实现的方法
  • 具体策略类:具体策略类实现了策略接口,并提供了具体的算法实现
  • 上下文类:上下文类持有一个策略接口的引用,并在运行时根据需要调用具体策略类的方法

3.使用场景:

即不同的对象对于同一动作有不同的行为的时候。

比如同样都是支付行为,微信支付没有优惠,支付宝支付有优惠。支付动作可以定义在策略接口,微信支付和支付宝支付分别实现这个接口,然后支付者作为使用者有一个统一的支付方法,参数就是支付策略接口,那么选择支付宝支付,就是策略接口指向支付宝支付实现类,然后调用支付方法。

// 策略接口
interface Strategy {
    void execute();
}

// 具体策略类1
class ConcreteStrategy1 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略1");
    }
}

// 具体策略类2
class ConcreteStrategy2 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略2");
    }
}

// 上下文类
class Context {
    private Strategy strategy;

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

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

// 使用策略模式
public class Main {
    public static void main(String[] args) {
        Strategy strategy1 = new ConcreteStrategy1();
        Strategy strategy2 = new ConcreteStrategy2();

        Context context = new Context(strategy1);
        context.executeStrategy();

        context.setStrategy(strategy2);
        context.executeStrategy();
    }
}

 

 


 

 知识点补充:

在Java中,接口是一种抽象的数据类型,它定义了一组方法的签名,但没有提供方法的具体实现。接口可以被类实现,一个类可以实现一个或多个接口。

当你创建一个接口的对象时,你实际上是创建了一个指向具体实现类的引用。这意味着你可以使用接口类型的引用来调用实现类中定义的方法。

标签:Java,策略,void,接口,Strategy,详解,支付,设计模式,public
From: https://www.cnblogs.com/liyunzhouts/p/17870651.html

相关文章

  • 【STM32F103】HC-SR04超声波测距模块详解(附工程文件)
    前言:使用的硬件:STM32F103C8T6,HC-SR04,ST-Link(其他烧录器也可以),0.96寸OLED屏幕(非必须,仅供显示测距结果,可以使用串口助手代替),若干杜邦线。涉及操作stm32的GPIO口,外部中断,定时器,本文中不会详细解释,仅提供代码思路。HC-SR04:HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。......
  • java~将多个输出流压缩成一个zip文件
    hutool工具包可以帮我们完成这件事,几行代码可以实现,我们提供两种方式,压缩本地文件和压缩内存流。压缩本地文件@Testpublicvoidzip(){StringentryName="d:\\codegen\\1";StringzipFilePath="d:\\codegen\\example.zip";//将entryName这个文件或者目录,......
  • Java环境变量配置及报错java --version Error: could not open `D:\APP\Develop\JA
    C:\Users\Administrator>java--versionError:couldnotopen`D:\APP\Develop\JAVA\jre\lib\amd64\jvm.cfg'Java环境变量的配置控制面板→系统→高级系统设置→环境变量在下方系统变量中新建在下方系统变量中找到Path,双击打开,新建两个%JAVA_HOME%\bin%JAVA_HOME%\jre\b......
  • 虚拟机安装详解
    虚拟机安装 1.选择虚拟机软件
在安装虚拟机之前,需要选择一款合适的虚拟机软件。目前市面上有很多虚拟机软件供选择,如VMware、VirtualBox等。根据你的需求和操作系统的支持情况,选择合适的虚拟机软件。2.下载操作系统镜像文件
购买虚拟主机空间后,你会得到一个操作系统镜像文件......
  • java heap space解决方法
    在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的Heapsize不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError:Javaheapspace。所以产生这个异样的原因通常有两种:1.程序中出现了死循环2.程序占用内存太多,超过了JVM堆设置的最大值。对于第一种情况,需要自......
  • Java对接阿里云短信模块
    1.去阿里云申请短信签名,申请签名需要网站域名,注意申请,下来的就是签名主体2.申请签名模板拿到签名模板CODE3.RAM开通账号,并且权限要去找到那个短信服务的权限,配置给用户,可以拿到key和sercet4.开始java代码publicstaticfinalStringproduct="Dysmsapi";//产品域名,开发......
  • Java继承与多态:实现代码复用与扩展的利器
    一、概述在Java编程语言中,继承和多态是两个非常重要的概念,它们是实现代码复用、扩展性和灵活性的关键。本文将详细介绍Java继承和多态的概念、实现方法以及注意事项,帮助您更好地理解和应用这两种技术。二、Java继承继承的概念Java继承是面向对象编程中的一个基本概念,它允许我们基于......
  • java使用http工具类调用第三方接口
    java使用http工具类调用第三方接口一、所需maven依赖:<!--json依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version>......
  • 复习:Java基础-泛型方法
    泛型大家都很熟悉了泛型方法呢可能很多小伙伴都有混淆,今天来稍微复习一下泛型方法(普通方法)publicclassTest<T>{publicTf(Tc){//注意声明,使此方法成为泛型方法returnc;}}泛型方法(静态方法)这么写编译就通过不了错误写法publicclassTe......
  • android开发aar包或者jar包出现类重复问题Caused by: java.lang.RuntimeException: Du
    如果是仓库依赖的方式直接使用exclude语句移除相同的依赖库即可,如下:implementation("org.java-websocket:Java-WebSocket:1.5.2"){excludegroup:'org.slf4j',module:'slf4j-api'//exclude掉websocket库依赖的slf4j库}但是如果是aar包或者jar包里面的类重复呢?这个......