策略模式的结构

3分钟看懂设计模式01:策略模式 那我们知道了策略模式怎么实现,也就是已经有了一把锤子在手上了,那什么时候用这把锤子呢?1. 系统中需要动态地在几种算法中选择一种。2. 一个对象有很多的行为,如果不用策略模式就只能用一大堆的if…else…来实现。3. 不希望客户端知道复杂的、与算法相关的数据结构。在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。1.假设平台支持多种支付方式,比如微信、支付宝、银行卡等。2.如果你有一个应用程序,它可以以多种格式输出数据,比如XML、JSON或CSV。3. 阅读详情

意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。


策略模式的结构

  策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。

  这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。

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

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

源代码

  环境角色类

复制代码

public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){
        
        strategy.strategyInterface();
    }
    
}

复制代码

  抽象策略类

复制代码

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}

复制代码

  具体策略类

复制代码

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

复制代码

复制代码

public class ConcreteStrategyB implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

复制代码

复制代码

public class ConcreteStrategyC implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }

}

复制代码

  

使用场景

  假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

  根据描述,折扣是根据以下的几个算法中的一个进行的:

  算法一:对初级会员没有折扣。

  算法二:对中级会员提供10%的促销折扣。

  算法三:对高级会员提供20%的促销折扣。

  使用策略模式来实现的结构图如下:

源代码

  抽象折扣类

复制代码

public interface MemberStrategy {
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double calcPrice(double booksPrice);
}

复制代码

  初级会员折扣类

复制代码

public class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }

}

复制代码

  中级会员折扣类

复制代码

public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {

        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }

}

复制代码

  高级会员折扣类

复制代码

public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}

复制代码

   价格类

复制代码

public class Price {
    //持有一个具体的策略对象
    private MemberStrategy strategy;
    /**
     * 构造函数,传入一个具体的策略对象
     * @param strategy    具体的策略对象
     */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }
    
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}

复制代码

  客户端

复制代码

public class Client {

    public static void main(String[] args) {
        //选择并创建需要使用的策略对象
        MemberStrategy strategy = new AdvancedMemberStrategy();
        //创建环境
        Price price = new Price(strategy);
        //计算价格
        double quote = price.quote(300);
        System.out.println("图书的最终价格为:" + quote);
    }

}

复制代码

   从上面的示例可以看出,策略模式仅仅封装算法,提供新的算法插入到已有系统中,以及老算法从系统中“退休”的方法,策略模式并不决定在何时使用何种算法。在什么情况下使用什么算法是由客户端决定的。

认识策略模式

  策略模式的重心

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

  算法的平等性

  策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。

  所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

  运行时策略的唯一性

  运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

  公有的行为

  经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。

  这其实也是典型的将代码向继承等级结构的上方集中的标准做法。

 

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

策略模式详解 1.简介 在现实生活中长长遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超时促销可以采用打折、送商品、送积分等方法。 在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。 如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加。删除或更换算法要修改原代码,不易维护,违背开闭原则。如 阅读详情

相关推荐

软件体系结构--策略模式

文章目录概念代码实现优点 概念 策略模式定义了一类算法,分别封装起来,让这些算法之间可以相互替换,从而达到实现不同功能的目的。策略模式让算法的变化独立于使用算法的客户。 策略模式类图: 从图中可以看出,操作被封装到类中,这些又都实现了同一个接口,然后在Context类中被调用。 举一个具体的例子,如计算器: 代码实现 还是以计算器为例 首先是Operation接口: public interf...

Meskjei的博客 1202

策略模式,看一篇就够了

在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变 context 对象的执行算法。...

weixin_45866849的博客 9446

ESP32+micro-ROS机器人开发实战:轻量级ROS2嵌入式集成

ROS2是现代机器人软件栈的核心框架,其基于DDS的分布式通信与QoS保障能力为多节点协同提供基础支撑;而micro-ROS作为专为微控制器优化的ROS2兼容中间件,解决了资源受限设备(如ESP32)接入ROS2生态的关键难题。其通过分层架构将DDS通信下沉至上位机Agent,使MCU仅需运行轻量Client,大幅降低内存开销(实测<180KB)并保留标准ROS2接口语义。该方案广泛应用于教育机器人、移动底盘、传感器节点等嵌入式场景,尤其适合基于ESP-IDF开发的Wi-Fi/BLE物联网机器人系统。本文以

weixin_29025501的博客 400

策略模式 (Strategy Pattern)

策略模式 (Strategy Pattern)

sanmansan的博客 5276

TCMSP数据库+R语言实战:从网页爬虫到中药-靶点网络图的全流程解析

本文详细解析了如何使用R语言从TCMSP数据库抓取中药-靶点数据,并通过数据清洗、网络分析和可视化构建完整的中药作用机制研究流程。涵盖动态网页爬虫、ADME参数筛选、网络图构建及高级可视化技巧,为中医药现代化研究提供实用的生物信息学方法。

weixin_31304817的博客 337

OpenMV模块视觉测距(避障)+颜色识别+TFT-LCD显示(实现原理与代码分析)

上图所示代码实际运行的帧率比较低,主要原因有以下两个:1.硬件问题,博主使用的版本比较低,可以尝试使用高版本OpenMV2.图像滤波问题。之前加入图像滤波是想提高色块识别的准确性,但是相应的运算速度也会下降。

ediykk的博客 1万+

设计模式-策略模式

策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

鱼粉大王 8520

在VScode中配置Python开发环境(详细图片文字结合)

需要用到的软件下载包在官网里找一下,在window下的点击安装就行了;找一个3.8到3.10版本差不多都完善跟的上;

m0_72811193的博客 1599

设计模式 ~ 结构型模式 ~ 策略模式 ~ Strategy Pattern。

设计模式 ~ 结构型模式 ~ 策略模式 ~ Strategy Pattern。

lyfGeek的博客 348

VirtualBox创建虚拟机(为安装Ubuntu桌面系统)

Ubuntu的安装非常灵活。但是万变不离其宗,归纳起来,无非就是以下3种:(1)用户可以下载完整的ISO镜像文件,将其转移到各种介质上面,例如DVD或者U盘,然后以该介质引导系统进行安装。(2)用户可以下载一个非常小的网络安装器,利用该安装器引导系统进行在线安装。(3)用户可以将Ubuntu安装到一个U盘中,随身携带。为了便于读者学习,本节将介绍通过完整的ISO镜像文件安装Ubuntu。其他的安装方式将在后面介绍。

夏天又到了的专栏 2688

Ubuntu 20.04下大陆ARS408毫米波雷达点云数据采集与RVIZ实时可视化全流程解析

本文详细解析了在Ubuntu 20.04系统下,如何实现大陆ARS408毫米波雷达的点云数据采集与RVIZ实时可视化全流程。内容涵盖硬件连接、ROS Noetic环境搭建、CAN接口配置、数据验证及自动化脚本编写,为机器人感知、自动驾驶等领域的开发者提供了一套稳定、实用的实战方案。

bash7scripter的博客 699

设计模式(一)策略模式——策略模式结构

前言 策略模式是行为型设计模式的一种,关于策略模...

lishuzhen5678的博客 685

vTestStudio保姆教程之从0到1搭建软件环境

学习HIL测试的必经之路,保姆级教学VT从搭建到测试。

欢迎来到eee的博客 4187

java 策论模式 包结构_设计模式之策略模式(Strategy Pattern)

模式分析:策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。使用场景:许多相关的类仅仅是行为差异运行时选取不同的算法变体通过条件语句在多个分支中选取一优缺点:优点:提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公用的代码移到父类里面,从而可以避免重复的代码。策略模式...

weixin_31965935的博客 340

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

MSS = MTU - tcpHeader - ipHeader,也就是MTU = MSS(1360) + tcpHeader(20) + ipHeader(20) = 1400,说明CAPL是可以动态设置网络底层配置参数的!然后在CAPL中设置此网卡MTU值为1400,然后创建UDP套接字,一次性发送2000个字节,在Trace窗口看看首帧报文二层Data的长度。所以我们还不能用UDP协议来验,应该用TCP协议来验,也就是在TCP三次握手时通过Tester的MSS值推导出自己的MTU值。

jasonj333 992

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++数据结构设计:理解并选择策略模式与模板特化

设计数据结构时,开发者需要在多种技术之间做出选择,比如使用策略模式或模板特化来处理数据结构中的某些特定行为。这种选择类似于人类在日常生活中根据不同情境作出的决策。就像选择穿着舒适的鞋子以适应长时间的步行,或选择合适的交流方式来适应不同的社交场合一样,选择合适的数据结构设计模式能够确保软件在面对不同的需求和挑战时表现出最佳性能。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1243

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用工厂模式+策略模式来优化代码结构

1. 业务场景 我们在新做的项目中有一个这样的应用场景,用户会导入不同平台的数据来存入mongodb中,不同平台的数据格式不一样,使用传统的mongoDB Model的方式需要建立太多的model,在后期维护上新加一个平台就需要增加一个model类重新上线一次,在可用性上不太合适,于是我考虑到工厂模式+策略模式来优化代码结构 2. 流程图 3. 代码 service interface service impl Strategy ...

安余生的博客 432

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java 策论模式 包结构_设计模式之--策略模式及其在JDK中的应用

前言:本文主要介绍设计模式中的策略模式,准备按照以下几个方面展开:什么是策略模式策略模式结构和UML图策略模式在JDK中的应用一、什么是策略模式以及策略模式功能1.1 为什么需要策略模式?1)完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。2)在软件系统中,很多算法可以实现某一功能,比如查找、排序。这里以查找算法为例说明,...

weixin_28932161的博客 491

【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

SevenCoding的博客 1079

JS使用策略模式优化条件选择结构

这段代码是采用if-else的方式判断多个不同的条件。 function permission(role){ if(role === "operations"){ getOperationPermission() }else if(role === "admin"){ getAdminPermission() }else if(role ...

罗毅豪的博客 138

代码结构优化——工厂+策略模式解耦条件判断

设计模式结合实践:用工厂+策略替代if-else结构

2301_78017102的博客 388

面试八股之设计模式3.1——模式策略——策略模式概念及结构

🔥本篇概览:详细讲解了策略模式概念及结构。

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1078

软件设计模式及体系结构之策略模式

1.策略模式概述 前言 分析: 1.实现某个目标的途径不止一条,可根据实际情况选择一条合适的途径 2.软件开发: 一.多种算法,例如排序、查找等 二.使用硬编码(Hard Coding)实现将导致系统违背开闭原则,扩展性差,且维护困难 可以定义一些独立的类来封装不同的算法, 每一个类封装一种具体的算法→策略类 一.策略模式的定义 策略模式:定义一系列算法,将每一个算法装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。 又称为改策( Policy)模式 每一个封装算法的类称之为策略

lpblog的博客 974

spring boot + 策略模式消除代码中过多的ifelse结构

利用spring boot + 策略模式消除代码中过多的if~else结构 // 结构示例: if (warnType == A) { System.out.println("A"); } else if (warnType == B) { System.out.println("B"); } else if (warnType == C) { Syste...

ty0903csdn的博客 1299

策略模式+工厂模式优化if-elseif结构

以监听zookeeper watacher为例,可以看出监听不同事件触发处理逻辑中有很多if-elseif结构 public class ZkDemo implements Watcher { private static final String connectString = "localhost:2181"; private static Stat stat = new Stat(); private static CountDownLatch countDownLatc

weixin_41645232的博客 404

java 策论模式 包结构_策略模式

在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设Java 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 co...

weixin_33863049的博客 322
上一篇: 23种设计模式(19)java责任链模式
下一篇: java策略模式与Spring整合
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值