策略 模式

news2024/11/25 22:46:06

策略模式

参考:

三种新姿势:帮你干掉过多的if-else (qq.com)

http://t.csdn.cn/5YeOZ

http://t.csdn.cn/HcGYw

JAVASE中GUI编程中,布局管理 ;
Spring框架中,Resource接口,资源访问;
javax.servlet.http.HttpServlet#service();
如果一个方法有大量if else语句,可通过策略模式来消除掉;
一个系统,需要动态地在几个算法中选择一种,可用策略模式实现;
系统有很多类,而他们的区别仅仅在于他们的行为不同

优点:

  • 开闭原则;
  • 避免使用多重条件转移语句;
  • 提高了算法的保密性和安全性:可使用策略模式以避免暴露复杂的,与算法相关的数据结构。

三种角色

  • 环境 (Context):持有一个策略类的引用,最终给客户端调用。
  • 抽象策略 (Strategy): 策略类,通常是一个接口或者抽象类。
  • 具体策略 (ConcreteStrategy):实现了策略类中的策略方法,封装相关的算法和行为。

在使用时,直接使用(环境)的类,通过不同状态类型,给他装配不同的实现的具体策略,以此来实现灵活装配

两个原则:

  1. 封装变化的概念。
  2. 编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。

理解:

对一系列相似类型的算法逻辑进行接口封装,有调用者决定具体使用哪一套实现的逻辑算法;

针对接口编程,而不是针对实现编程,使用哪个接口的实现类就是具备这个实现类的特性

简单例子:

TreeSet进行比较时,需要指定Comparator接口类型,用户根据自己的规则升序还是降序,自定义实现接口来灵活控制

在这里插入图片描述

package com.ung.myBatisPlusTest.mode.policyMode;

/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description:
 */
public class TestStrategy {
    public static void main(String[] args) {
        String type = "普通客户小批量";
        double price = 100;
        //使用if else
//        price = getPrice(type, price);

        //使用策略模式
//        Context context = new Context();
//        context.setStrategy(new OldCustomerManyStrategy());
//        price = context.getPrice(price);

        //使用策略模式

        Context context = new Context();
        Strategy strategy = StrategyFactory.getInstance().getStrategy(type);
        context.setStrategy(strategy);
        price = context.getPrice(price);

        System.out.println(price);

    }

    /**
     * if else
     * 实现简单
     * 缺点明显,类型较多需要修改时,难以维护
     */
    public static double getPrice(String type, double price) {
        if (type.equals("普通客户小批量")) {
            System.out.println("不打折,原价");
            return price;
        } else if (type.equals("普通客户大批量")) {
            System.out.println("打九折");
            return price * 0.9;
        } else if (type.equals("老客户小批量")) {
            System.out.println("打八五折");
            return price * 0.85;
        } else if (type.equals("老客户大批量")) {
            System.out.println("打八折");
            return price * 0.8;
        }
        return price;
    }
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description: 环境 用来装配使用策略接口
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Context {

    private Strategy strategy;

    public double getPrice(double price) {
        return strategy.getPrice(price);
    }
}
/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description: 策略类,通过不同实现类实现不同策略
 */
public interface Strategy {
    double getPrice(double price);
}
/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description:
 */
public class NewCustomerFewStrategy implements Strategy {
    @Override
    public double getPrice(double price) {
        System.out.println("不打折,原价");
        return price;
    }
}
/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description:
 */
public class NewCustomerManyStrategy implements Strategy {
    @Override
    public double getPrice( double price) {
        System.out.println("打九折");
        return price*0.9;
    }
}
package com.ung.myBatisPlusTest.mode.policyMode;

/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description:
 */
public class OldCustomerFewStrategy implements Strategy {
    @Override
    public double getPrice( double price) {
        System.out.println("打八五折");
        return price*0.85;
    }
}
package com.ung.myBatisPlusTest.mode.policyMode;

/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description:
 */
public class OldCustomerManyStrategy implements Strategy {
    @Override
    public double getPrice( double price) {
        System.out.println("打八折");
        return price*0.8;
    }
}

使用工厂+单例模式将选择权交给使用者

package com.ung.myBatisPlusTest.mode.policyMode;

import com.google.common.collect.ImmutableMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.security.PublicKey;
import java.util.Map;

/**
 * @author: wenyi
 * @create: 2022/8/30
 * @Description: 单例 工厂模式
 */
@Data
@NoArgsConstructor
public class StrategyFactory {
    private static Map<String, Strategy> map;

    /**
     * 维护一个map作为工厂模式
     */
    static {
        map = ImmutableMap.of(
                "普通客户小批量", new NewCustomerFewStrategy(),
                "普通客户大批量", new NewCustomerManyStrategy(),
                "老客户小批量", new OldCustomerFewStrategy(),
                "老客户大批量", new OldCustomerManyStrategy()
        );
    }

    public static class SingletonHolder {
        public static StrategyFactory strategyFactory = new StrategyFactory();
    }

    public static StrategyFactory getInstance() {
        return SingletonHolder.strategyFactory;
    }

    public Strategy getStrategy(String type) {
        return map.get(type);
    }
}

总结:

个人理解就是一个 操作类 Context ,里面有属性策略 Strategy接口

Strategy接口有不同的策略实现类,通过给Context 构造不同的Strategy实现类,来实现不同的策略使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优美的曲线(含蝴蝶线)-CoCube

复现如下这篇&#xff1a; 优美的曲线-turtlesim 两段视频&#xff1a; 优美的曲线-CoCubebutterfly蝴蝶曲线之CoCube篇如何更深入分析&#xff0c;获得更高精度曲线呢&#xff1f; 对比下面两幅图&#xff1a; 尤其需要注意右图&#xff0c;右下角。 什么原因导致这个控制量…

一个元素纯CSS实现开关按钮【介绍box-shadow、单边或多重阴影、appearance属性】

借助checkbox表单元素、:checked伪类、::before/::after伪元素&#xff0c;就可以只需一个input[type"checkbox"]元素&#xff0c;通过纯CSS实现Switch开关效果的按钮。 主要用到的属性&#xff1a; appearance 默认css元素样式box-shadow 阴影效果transition css动…

ICG maleimide, ICG-MAL,2143933-81-5,ICG和PEG链接可在体内长循环.

英文名&#xff1a;ICG maleimide ICG-MAL CAS&#xff1a;2143933-81-5 分子式: C51H56N4O6S 分子量: 853.09 外 观&#xff1a;绿色粉末 溶解度&#xff1a;二氯甲烷 纯 度&#xff1a;95% 结构式&#xff1a; ICG is a tricarbocyanine-type dye with NIR-absorb…

Jenkins自动化测试Robot Framework详解

目录 1. Robot Framework 概念 2. Robot Framework 安装 3. Pycharm Robot Framework 环境搭建 4. Robot Framework 介绍 5. Jenkins 自动化测试 总结 重点&#xff1a;配套学习资料和视频教学 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;…

MySQL——怎么给字符串字段加索引

现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是本篇文章要讨论的问题。 假设&#xff0c;现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; mysql> create table SUser( ID big…

Hive 分析银行转账风险

文章目录创建数据源基于转账记录&#xff0c;计算 7 天内各个账号的转账金额找出相同收付款人 5 天内连续转账3次或以上的记录创建数据源 数据来源&#xff1a;数据源 drop table transfer_log;CREATE TABLE transfer_log ( log_id bigint, -- idlog_ts timestamp, -- 操作时…

128-152-spark-核心编程-源码

128-spark-核心编程-源码&#xff08;主要以了解基本原理和流程为主&#xff09;&#xff1a; 总体相关 ​ 1.环境准备(Yarn 集群) ​ (1) Driver, Executor ​ 2.组件通信 ​ (1) Driver > Executor ​ (2) Executor > Driver ​ (3) Executor > Executor ​ 3.应用…

Unity异步加载AB包

Unity异步加载AB包写在前面效果关键讲解项目地址写在后面写在前面 最近项目需要在Unity中完成一个非常耗时的工作&#xff0c;所以学习了下异步加载的流程&#xff0c;这里做了一个demo&#xff0c;异步加载AB包&#xff0c;其实异步加载场景等&#xff0c;原理差不多。 效果…

Tomcat的Maven插件使用方法(在idea里面运行Tomcat)

目录 一、概述 二、下载和导入插件 三、测试使用方式 四、总结 一、概述 使用这个插件可以快速的运行Tomcat&#xff0c;比在本地配置快得多。 二、下载和导入插件 1.下载插件Maven Helper ps&#xff1a;已经有下载过这个插件的可以跳过此步骤 &#xff08;1&#xff…

一、导论——可解释性机器学习(DataWhale组队学习)

目录导言一、什么是可解释人工智能?二、学可解释机器学习有什么用?2.1学习可解释机器学习的原因2.2 Machine Teaching :人工智能教人类学习2.3 细粒度图像分类2.4前沿AI三、本身可解释性好的机器学习模型四、传统机器学习算法的可解释性分析五、卷积神经网络的可解释性分析5.…

前端基础(二)_HTML常用标签(块级标签、行级标签、行块级标签)

HTML常用标签 我们可以分为三类&#xff1a; 1.块级标签 2.行级标签 3.行块级标签 一、块级标签 1.1 h系类标签 标题标签 H1~h6 大到小 H1 在同一个页面中只能使用一次 其他标签可以重复 特点&#xff1a;默认宽度100% 高度自适应 独立成行 自带间距加粗 <body><…

java计算机毕业设计ssm制造型企业仓储管理系统i0180(附源码、数据库)

java计算机毕业设计ssm制造型企业仓储管理系统i0180&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

[附源码]计算机毕业设计的项目管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

基于小波变换的图像压缩解压缩的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 图像压缩的类别 对于图像压缩&#xff0c;主要有两类方法&#xff1a;无损的图像压缩以及有损的图像压缩&#xff0c;分别称为lossless image compression and lossy image compression。 对于无…

[附源码]Node.js计算机毕业设计动漫网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

第37篇 网络(七)TCP(一)

导语 TCP即TransmissionControl Protocol&#xff0c;传输控制协议。与UDP不同&#xff0c;它是面向连接和数据流的可靠传输协议。也就是说&#xff0c;它能使一台计算机上的数据无差错的发往网络上的其他计算机&#xff0c;所以当要传输大量数据时&#xff0c;我们选用TCP协议…

ssm+Vue计算机毕业设计校园生活服务预约管理系统(程序+LW文档)

ssmVue计算机毕业设计校园生活服务预约管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;…

spring切入点表达式(一)

前面写到切入点表达式&#xff0c;如果把全部方法都作为切入点的话&#xff0c;用execution(* *(..))表达式&#xff0c;这个表达式代表什么意思呢&#xff1f; public void login (String name,String address){} * * ( . . ) * *(..)对应方法如上图 * -------->代表修…

【GRU回归预测】基于鲸鱼算法优化门控循环单元WOA-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

网络协议—应用层的HTTPS协议

用 HTTP 协议&#xff0c;看个新闻还没有问题&#xff0c;但是换到更加严肃的场景中&#xff0c;就存在很多的安全风险。例如&#xff0c;你要下单做一次支付&#xff0c;如果还是使用普通的 HTTP 协议&#xff0c;那你很可能会被黑客盯上。例如在点外卖的环境中&#xff0c;发…