笨蛋学设计模式行为型模式-策略模式【16】

2024-01-21 08:12

本文主要是介绍笨蛋学设计模式行为型模式-策略模式【16】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

行为型模式-策略模式

    • 8.3策略模式:arrow_up::arrow_up::arrow_up:
      • 8.3.1概念
      • 8.3.2场景
      • 8.3.3优势 / 劣势
      • 8.3.4策略模式可分为
      • 8.3.5策略模式
      • 8.3.6实战
        • 8.3.6.1题目描述
        • 8.3.6.2输入描述
        • 8.3.6.3输出描述
        • 8.3.6.4代码
      • 8.3.7总结

8.3策略模式⬆️⬆️⬆️

8.3.1概念

​ 策略模式定义了一系列算法(这些算法完成的是相同的工作,只是实现不同),允许在运行时动态地选择算法或行为,并将每个算法封装成独立的策略对象,使它们可以相互替换,而且算法的变化不会影响使用算法的客户。

8.3.2场景

​ 在购物平台上,我们需要实现一个促销活动功能。可以通过使用策略模式来实现不同类型的促销策略,比如折扣、满减、赠品等,每个促销策略可以被封装成一个独立的策略类,客户端根据不同的促销需求来选择不同的策略进行结算。

8.3.3优势 / 劣势

  • 可扩展性:可以轻松地添加新的策略类,无需修改已有的代码
  • 遵循开闭原则:对扩展开发,对修改关闭,通过定义接口或抽象类作为策略类的共同父类,客户端可以针对抽象策略类编程,而无需关系具体策略类的实现细节
  • 算法独立:将算法的选择和实现分离,使得算法可以独立于客户端变化,客户端就可以根据需求选择不同的策略

  • 代码复杂性增加:会增加系统中类和对象的数量,导致代码的复杂度增加
  • 客户端复杂性增加:客户端必须了解所有的策略类,以此来自行决定使用哪个策略类

8.3.4策略模式可分为

  • 策略类Strategy:定义所有支持的算法的公共解耦
  • 具体策略类ConcreteStrategy:实现了策略接口,提供具体的算法实现
  • 上下文类Context:包含一个策略实例,并在需要时调用策略对象的方法

8.3.5策略模式

package com.technologystatck.designpattern.mode.strategy;public class Strategys {public static void main(String[] args) {//创建上下文对象,并设置具体的策略Context contextA = new Context(new ConcreteStrategyA());//执行策略contextA.contextInterface();Context contextB = new Context(new ConcreteStrategyB());contextB.contextInterface();}
}//1.抽象策略抽象类
abstract class Strategy {//抽象方法public abstract void algorithmInterface();
}//2.具体策略类1
class ConcreteStrategyA extends Strategy{@Overridepublic void algorithmInterface() {System.out.println("Strategy A");}//具体的策略1执行逻辑
}//3.具体策略类2
class ConcreteStrategyB extends Strategy{@Overridepublic void algorithmInterface() {System.out.println("Strategy B");}//具体的策略2执行逻辑
}//4.上下文类
class Context {private Strategy strategy;//设置具体的策略public Context(Strategy strategy){this.strategy=strategy;}//执行策略public void contextInterface(){strategy.algorithmInterface();}
}

8.3.6实战

8.3.6.1题目描述

小明家的超市推出了不同的购物优惠策略,你可以根据自己的需求选择不同的优惠方式。其中,有两种主要的优惠策略:

  1. 九折优惠策略:原价的90%。
  2. 满减优惠策略:购物满一定金额时,可以享受相应的减免优惠。

具体的满减规则如下:

满100元减5元

满150元减15元

满200元减25元

满300元减40元

请你设计一个购物优惠系统,用户输入商品的原价和选择的优惠策略编号,系统输出计算后的价格。

8.3.6.2输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示需要计算优惠的次数。

接下来的 N 行,每行输入两个整数,第一个整数M( 0 < M < 400) 表示商品的价格, 第二个整数表示优惠策略,1表示九折优惠策略,2表示满减优惠策略

8.3.6.3输出描述

每行输出一个数字,表示优惠后商品的价格

8.3.6.4代码
package com.technologystatck.designpattern.mode.strategy;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//读取需要计算优惠的次数int nums = Integer.parseInt(scanner.nextLine());for(int i=0;i<nums;i++){//读取商品价格和优惠策略String[] inputs = scanner.nextLine().split(" ");int price = Integer.parseInt(inputs[0]);int strategyType = Integer.parseInt(inputs[1]);//根据优惠策略设置相应的打折策略DiscountStrategy discountStrategy=null;switch (strategyType){case 1:discountStrategy=new DiscountStrategy9();break;case 2:discountStrategy=new DiscountStrategyFull();break;default:System.out.println("输入有误");break;}//设置打折策略//实例化一个上下文类DiscountContext context = new DiscountContext();//设置策略context.setStrategy(discountStrategy);//计算优惠后的价格int discountPrice = context.applyDiscount(price);System.out.println(discountPrice);}}
}//抽象购物优惠策略接口
interface DiscountStrategy {//抽象方法int applyDiscount(int originalPrice);
}//9折优惠策略
class DiscountStrategy9 implements DiscountStrategy {@Overridepublic int applyDiscount(int originalPrice) {return (int) Math.round(originalPrice * 0.9 );}
}
//满减优惠策略
class DiscountStrategyFull implements DiscountStrategy {//定义满足的价格private int[] thresholds ={100,150,200,300};//定义折扣力度private int[] discounts={5,15,25,40};@Overridepublic int applyDiscount(int originalPrice) {//遍历价格表for(int i=thresholds.length-1;i>=0;i--){//若有满足的条件的价格if(originalPrice >=thresholds[i]){//就不再继续遍历,直接返回优惠后的价格//即优惠价=原价-满减多少的价格return originalPrice-discounts[i];}}return originalPrice; //没有满足条件的优惠,返回原价格}
}//上下文类
class DiscountContext {private DiscountStrategy strategy;//设置set方法public void setStrategy(DiscountStrategy strategy) {this.strategy = strategy;}//输入原价格public int applyDiscount(int originalPrice){return strategy.applyDiscount(originalPrice);}
}

8.3.7总结

  • 优点:避免代码的重复,使得每个算法都可以独立于使用它的客户端,增加了选择
  • 总结:定义了一系列的算法,将每个算法封装起来,根据不同的应用场景选择算法中最合适的算法
  • 场景
    • 系统根据业务场景需要动态地在几种算法中选择一种时
    • 代码中存在大量条件按判断,且条件判断的区别仅仅在于行为,可以使用策略模式消除这些条件语句

这篇关于笨蛋学设计模式行为型模式-策略模式【16】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628891

相关文章

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

C++中的解释器模式实例详解

《C++中的解释器模式实例详解》这篇文章总结了C++标准库中的算法分类,还介绍了sort和stable_sort的区别,以及remove和erase的结合使用,结合实例代码给大家介绍的非常详细,感兴趣... 目录1、非修改序列算法1.1 find 和 find_if1.2 count 和 count_if1

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

深入理解MySQL流模式

《深入理解MySQL流模式》MySQL的Binlog流模式是一种实时读取二进制日志的技术,允许下游系统几乎无延迟地获取数据库变更事件,适用于需要极低延迟复制的场景,感兴趣的可以了解一下... 目录核心概念一句话总结1. 背景知识:什么是 Binlog?2. 传统方式 vs. 流模式传统文件方式 (非流式)流

Redis中删除策略的几种实现方式

《Redis中删除策略的几种实现方式》本文详细介绍了Redis的过期键删除策略和内存淘汰策略,过期键删除策略包括定时删除、惰性删除和定期删除,具有一定的参考价值,感兴趣的可以了解一下... 目录前言一、设计背景:为什么需要删除策略?二、第一类:过期键的 3 种核心删除策略1. 定时删除(Timed Dele

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买