JAVA设计模式十:--strategy(策略者模式)

详解几种常见设计模式Singleton、Factory、Strategy在项目中的应用 本文转载自:详解几种常见设计模式Singleton、Factory、Strategy在项目中的应用 一、前言 前几天阅读一框架文档,里面有一段这样的描述 “从对象工厂中………” ,促使写下本文。尽管一些模式简单和简单,但是常用、有用。 结合最近一个项目场景回顾一下里面应用到的一些模式<Singleton、Factory、Strategy>。 Singleton:创建型模式,负责创建... 阅读详情
点击打开转载处链接
概念:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独
立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes 
them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
Context(应用场景):
  1、需要使用ConcreteStrategy提供的算法。
  2、内部维护一个Strategy的实例。
  3、负责动态设置运行时Strategy具体的实现算法。
  4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
  1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,
一般使用接口或抽象类实现。
  ConcreteStrategy(具体策略类):
  2、 实现了Strategy定义的接口,提供具体的算法实现。
应用场景:
  1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
  2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
  3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
优点:
  1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
  2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
  3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:

  1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。  


 如图 :




举例:

[java]  view plain copy print ?
  1. package design.strategy;  
  2. /** 
  3.  * 文件名称:design.strategy.IDiscount.java 
  4.  * 创建人:Fei Wong 
  5.  * 创建时间: 2012-06-21 
  6.  * 电子邮箱:feiwong8@126.com 
  7.  * 说明:打折算法基类 
  8.  * */  
  9. public interface IDiscount {  
  10.     void discount() ;   
  11. }  
  12.   
  13.   
  14.   
  15.   
  16. package design.strategy;  
  17. /** 
  18.  * 文件名称:design.strategy.DiscountHalf.java 
  19.  * 创建人:Fei Wong 
  20.  * 创建时间: 2012-06-21 
  21.  * 电子邮箱:feiwong8@126.com 
  22.  * 说明:打折种类算法 
  23.  * */  
  24. public class DiscountHalf implements IDiscount {  
  25.   
  26.     @Override  
  27.     public void discount() {  
  28.         System.out.println( "---半价---" );   
  29.     }  
  30.       
  31. }  
  32.   
  33.   
  34.   
  35.   
  36. package design.strategy;  
  37. /** 
  38.  * 文件名称:design.strategy.DiscountEight.java 
  39.  * 创建人:Fei Wong 
  40.  * 创建时间: 2012-06-21 
  41.  * 电子邮箱:feiwong8@126.com 
  42.  * 说明:打折种类算法 
  43.  * */  
  44. public class DiscountEight implements IDiscount {  
  45.   
  46.     @Override  
  47.     public void discount() {  
  48.         System.out.println( "---八折---" );   
  49.     }  
  50.       
  51. }  
  52.   
  53.   
  54.   
  55.   
  56. package design.strategy;  
  57.   
  58. /** 
  59.  * 文件名称:design.strategy.StrategyFactory.java  
  60.  * 创建人:Fei Wong  
  61.  * 创建时间: 2012-06-21 
  62.  * 电子邮箱:feiwong8@126.com  
  63.  * 说明:用于选择策略 
  64.  */  
  65. public class StrategyFactory {  
  66.     IDiscount dis;  
  67.       
  68.     public StrategyFactory(int i) {  
  69.         switch (i) {  
  70.         case 0:  
  71.             dis = new DiscountHalf();  
  72.             break;  
  73.         case 1:  
  74.             dis = new DiscountEight();  
  75.             break;  
  76.         default:  
  77.             dis = new DiscountEight();  
  78.             break;  
  79.         }  
  80.     }  
  81.       
  82.      public void showMessage()  
  83.      {  
  84.          dis.discount() ;   
  85.      }  
  86. }  
  87.   
  88.   
  89.   
  90.   
  91. package design.strategy;  
  92. /** 
  93.  * 文件名称:design.strategy.Main.java 
  94.  * 创建人:Fei Wong 
  95.  * 创建时间: 2012-06-21 
  96.  * 电子邮箱:feiwong8@126.com 
  97.  * 说明:测试类 
  98.  * */  
  99. public class Main {  
  100.   
  101.     public static void main(String[] args) {  
  102.         StrategyFactory factory = new StrategyFactory( 0 ) ;  
  103.         factory.showMessage() ;   
  104.     }  
  105.       
  106. }  
23种设计模式-策略(Strategy)设计模式 软考中级-软件设计师 策略设计模式 阅读详情

相关推荐

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1)

本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行

weixin_55313207的博客 1363

介绍一下什么是策略工厂

通过告诉工厂需要哪种策略,工厂会负责创建相应的策略实例,而客户端则可以通过统一的接口来调用这些策略的方法,而无需关心具体实现的细节。我来解释一下,就是我可以找这个工厂告诉他我需要什么策略,他就可以把这个策略(接口的实现类)给我,然后我调用方法就可以了,因为他们都是相同的父类,所以我不用关心这些策略的实现类是什么,只需要知道他们的名字就行了。同时,通过使用相同的接口,客户端可以统一对待不同的策略,降低了代码的耦合度,提高了代码的可维护性和可扩展性。包含了用于选择和创建策略的方法。策略工厂相对于简单工厂。

qq_44145781的博客 654

第二章-Ethernet/IP基本概念

在I/O连接中,一旦连接建立,就不会有请求-响应数据,只会按照连接建立时指定的生产触发器所确定的时间间隔生产和消耗带有ConnectionID的数据。连接是通过连接管理器对象的Forward请求服务建立的,ForwardOpen请求包含所有连接参数,包括传输类、生产触发器、定时信息、电子密钥和连接ID。I/O适配器:I/O适配器从I/O扫描器接收隐式通信连接请求,然后以请求的速率生成I/O数据。I/O扫描器:启动与I/O适配器的隐式通信,需要处理连接的配置以及如何配置适配器。扫描器还支持启动显式报文。

_Nooice的博客 1233

详解Singleton、Factory、Strategy在项目中的应用

一、前言 前几天阅读一框架文档,里面有一段这样的描述 “从对象工厂中………” ,促使写下本文。尽管一些模式简单和简单,但是常用、有用。 结合最近一个项目场景回顾一下里面应用到的一些模式 Singleton、Factory、Strategy。 Singleton:创建型模式,负责创建维护一个全局唯一实例 Factory:创建型模式,对象工厂负责根据标识创建或获取具体的实例对象 Strategy:行...

qianlia的博客 936

05、基于ALV表报实现复选框、全选、取消全选等功能

基于Function ALV实现复选框、全选及取消全选等功能

wo520yl1314的博客 2372

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

对Factory,strategy,template模式的总结

一)Factory工厂模式:1)简单工厂模式相当于new一个实例。而作为工厂,当然new的不只是一个实例,而是多个实例。我们可以通过switch或者if来控制生成你所需要的实例。2)抽象工厂模式抽象工厂的作用是来new一组实例对象,通过extends一个抽象类,重写多个抽象方法,每个抽象方法new一个实例对象。这样,就可以一个实现可以同时实例化一组对象。二)stra

佳茗的专栏 447

【C语言】初识C语言(上篇)

初识C语言第一部分

StackFrame 4018

golang 策略模式与策略工厂模式

什么是策略模式 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 什么是策略工厂模式 在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度 代码 在下面的代码中,分别用策略模式和策略工厂模式实

m0_37681974的博客 1187

【C2000系列DSP的Bootloader详解】实现过程、流程图与示例代码

C2000 Bootloader 的核心逻辑可概括为 “初始化→选模式→加载程序→校验→跳转” 五步。对于小白来说,无需纠结底层寄存器配置(驱动库已封装),重点理解 “启动流程” 和 “数据传输 + 校验” 的核心思想即可。 通过本文的流程图和示例代码,相信你已经掌握了 C2000 Bootloader 的核心原理。实际开发中,可基于 TI 提供的 Bootloader 示例(C2000Ware 中自带)进行修改,快速适配自己的硬件和应用场景。

昔时扬尘处 374

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 322

JAVA设计模式十--strategy(策略者模式)

概念 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独 立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes  them interchangeable. Strategy lets the alg

Y-CAT的专栏 1259

高通开发系列 - Bootloader之lk匹配dtb和dtbo中msm-id和board-id的知识

lk匹配dtb和dtbo中的msm-id和board-id等知识

fulinux的博客 4246

Java设计模式十: 策略模式(Strategy)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于是用它的客户而独立变化。应用场景:多个类只区别在表现行为不同,可以使用strategy模式,在运行时动态选择具体要执行的行为。需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其他方式来实现。对客户隐藏具体策略(算法)的实现细节,彼此完全独立。在网上看到一个鸭子为例的策略模式的文章,说明的

萌萌的It人 www.itmmd.com 896

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java设计模式—策略模式(Strategy)

策略(Strategy)模式是一种行为设计模式,它使你能在运行时改变对象的行为。它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为型模式。策略模式包含三个角色:环境类在解决某个问题时可以采用多种策略,在环境类中维护一个对抽象策略类的引用实例;

weixin_43841461的博客 2332

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【设计模式】Java 设计模式之模板策略模式(Strategy)

策略模式是一种灵活的设计模式,它允许在运行时动态改变对象的行为。通过定义一系列可互相替换的算法,策略模式使得算法独立于使用它的客户端,提高了系统的可维护性和可扩展性。策略模式经常与其他设计模式结合使用,如工厂模式,用于创建具体的策略对象。然而,频繁切换策略可能带来性能开销,因此需权衡其利弊。策略模式适用于需要根据不同情况使用不同算法或行为的场景,如支付系统或电商平台的促销活动。未来,随着技术发展和业务需求变化,策略模式将继续发挥重要作用,推动软件行业的进步。

新手村长的专栏 2141

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式第2讲——策略模式(Strategy)

策略模式属于行为型设计模式。一、什么是策略模式 二、角色组成 三、优缺点四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0、UML类图5.1、VideoContext——环境类(Context)5.2、VideoStrategy——抽象策略类(Strategy)5.3、具体策略类(Concrete Strategy)5.4、TestStrategy

让~学习~成为一种习惯(橡 皮 人の技术博客) 3455

策略设计模式(Strategy)

策略设计模式(Strategy):可以整体的替换一个算法的实现部分,能够整体的替换算法,能让我们轻松地用不同方法解决同一个问题。 1. 示例程序 举一个收银的例子,普通用户打95折,会员打8折,超级会员打6折。 如果在一个函数里面去解决这些问题,那么增加会员类型和折扣变化的时候会导致代码臃肿,难以维护。 可以使用策略模式去解决这个问题。策略模式只适用管理一组同类型的算法,并且这些算...

学习笔记 7469

设计模式-策略(Strategy)模式

设计模式-策略(Strategy)模式

汤键的博客 4130

java I/O策略及Strategy设计模式

Introduction 之前一直忘记了要更新博客,课程要求,所以在空闲时写下这篇博客。Lab5是改进程序性能,而程序的性能很大程度上和I/O有关系。所以这篇博客总结了3种I/O策略以及Strategy设计模式。 I/O策略 Input: 1.Reader: File file=new File(文件路径); FileReader fr=new FileReader(file);//新建一个Fil...

weixin_43868358的博客 436

Java设计模式之策略(Strategy)模式

策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化

小虎哥的技术博客 1452

23种设计模式——策略模式 (Strategy Pattern)​详解

本文介绍了23种经典设计模式之——策略模式 (Strategy Pattern)​的说明及使用

Meteors.的博客 837

Java设计模式之策略模式(Strategy)实践

策略模式定义:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 实际项目开发中,会有些类仅需要依靠行为就可以区分开来,这时候我们便可以利用封装,使用的时候按实际情况替换即可。 以下代码演示策略模式简单的实际运用: 定义一个Strategy接口: package com.ldl.cn.StrategyModel; public int...

SeeYouAgain的博客 4621

【设计模式】【行为型模式】策略模式(Strategy)

策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。策略模式通过将算法或行为封装到独立的类中,提供了一种灵活、可扩展的方式来管理代码中的变化部分。它的核心优势是解耦和动态切换,但也会带来类的数量增加和客户端使用成本的问题。适用于需要动态切换行为、避免重复代码或隔离算法实现细节的场景。优点●灵活性:允许在运行时动态切换算法或行为,无需修改客户端代码。●可扩展性:新增策略时只需添加新的策略类,符合开闭原则(对扩展开放,对修改关闭)。

flzjkl的博客 1372

Java 设计模式之策略模式 (Strategy Pattern) 详解

策略模式通过将算法的选择和实现分离,使得算法可以独立变化,客户端代码可以更简洁和灵活。策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换,从而使得算法的变化不会影响使用算法的客户端。策略模式的主要结构包括策略接口、具体策略类和上下文类,通过将算法的选择与使用分离,实现了代码的可维护性和灵活性。通过策略模式和工厂模式的结合,可以实现一个灵活、可扩展且易于维护的支付系统。通过策略模式,可以根据用户选择的支付方式动态切换支付策略。

微笑听雨 3575
上一篇: JAVA设计模式九:--Command(命令模式)
下一篇: JAVA设计模式十一:--Chain of Responsibility(职责链模式)
SuperDream
博客等级 码龄14年 5粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值