首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式实战-策略模式,想让你的代码变幻莫测吗?

.)中文解释为:定义一组算法,然后将这些算法封装起来,以便它们之间可以互换,属于一种对象行为型模式。...总的来说策略模式是一种比较简单的模式,听起来可能有点费劲,其实就是定义一组通用算法的上层接口,各个算法实现类实现该算法接口,封装模块使用类似于 Context 的概念,Context 暴漏一组接口,Context...大家在实际编程中,可能会用到 TreeSet 这种对象,TreeSet 构造时可以传入一个排序实现类以便指定集合元素被遍历时的顺序,当然不传使用默认的自然排序,如下,我们定义一个 TreeSet 并指定排序规则为自然排序的逆序...3、策略模式代码实现 上文中的类图我们来看下如下用代码实现: 首先是抽象策略角色: // 抽象策略角色 interface Strategy { void algorithmInterface(...5、应用场景 策略模式的应用场景如下: 需要自由切换算法的场景 需要屏蔽算法实现细节的场景 6、使用实例 还是拿我们最上面的排序为例进行说明,对于一个 List 的字符串集合,我们使用不同的排序策略,比如自然排序

28810

使用策略+工厂模式彻底干掉代码中的if else!

其实,if-else是有办法可以消除掉的,其中比较典型的并且使用广泛的就是借助策略模式和工厂模式,准确的说是利用这两个设计模式的思想,彻底消灭代码中的if-else。...这样的代码中,有很多if-else,并且还有很多的if-else的嵌套,无论是可读性还是可维护性都非常低。 那么,如何改善呢? 策略模式 接下来,我们尝试引入策略模式来提升代码的可维护性和可读性。...这个例子以及策略模式的相关知识,读者可以在《如何给女朋友解释什么是策略模式?》一文中学习。 但是,真正在代码中使用,比如在一个web项目中使用,上面这个Demo根本没办法直接用。...其实,在之前的《如何给女朋友解释什么是策略模式?》一文中,我们介绍了很多策略模式的优点。但是,策略模式的使用上,还是有一个比较大的缺点的: 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。...以上代码,其实还是有一些重复代码的,这里面还可以引入模板方法模式进一步精简,这里就不展开了。

4.4K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一起学设计模式吧!--模板模式​

    如果在项目开发中你经常看到一个类的某些方法和其他类的方法功能相同,只有部分不同或者只有具体实现不同,亦或者是你看到某些方法在多个地方都存在,有很多重复代码,这个时候你就可以拿出模板设计模式了。...定义与特点 模板方法(Template Method)模式的定义如下: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。...应用场景 模板模式应该是众多设计模式中相对简单的一种,但是它使用的频率可一点也不低,在各种开源框架代码中都可以看到它的身影,模板设计模式的应用场景主要有以下几类: 在多个子类中拥有相同的方法,而且逻辑相同...,可以将这些方法抽出来放到一个模板抽象类中 程序主框架相同,仅实现细节不同时,也可以使用模板方法 tips 记得几年前电话面试的时候,面试官问我有没有用过模板设计模式,我回答说“啊,模板?...你说的是freemarker吗?巴拉巴拉一大堆”,然后只听电话嘟嘟嘟响,留我一人在风中凌乱。 系列文章 命令模式 观察者模式 策略模式 ?

    46320

    Pulumi模式与实践平台 (P3):面向大型组织的参考架构

    有很多可重复使用的代码块的复制粘贴,但没有办法应用 DRY 原则或将重要部分模块化/模板化(提示:所有部分都很重要!)。 可重复性:可重复的行为,谁知道呢?...如果你运行两次部署,每次都会得到相同的结果吗?如果你复制生产环境来创建测试环境,它们实际上是相同的吗?让它们变得相同需要多少额外的工作?每次运行 AI 工作负载时,你都会获得相同版本的训练数据集吗?...RBAC、策略即代码、出色的密钥管理、与现有身份提供者的集成。这些是你构建可以依赖的安全和策略护栏所需要的。没有它们?这只是一桶装满炸药的责任,等待着火花。 可审计性:发生了什么以及谁做的?...我们将深入探讨不仅可以使用我们的工具做什么,还可以如何使用它们,并提供参考实现的代码,您可以使用它来启动该过程。...一致性 Pulumi 可以通过将设计模式编码到可重用的 组件资源 中,以及通过构建自定义提供无代码或低代码方式来启动新项目。模板有助于更快地启动项目,并确保一致的代码结构、策略合规性和最佳实践。

    7210

    「C++ 篇」答应我,别再ifelse走天下了可以吗

    前言 羊哥之前写一篇有趣的文章《答应我,别再if/else走天下了可以吗 | CodeSheep 》,在文中使用 Java 语言实现了枚举类、工厂模式和策略模式的三种方式,来消除连环的if/else。...下面的工厂类,改进了上面问题,同时采用模板技术,进一步对工厂类进行了封装,使得不管是角色类,还是其他类,只要存在多态特性的类,都可以使用此工厂类,可以说是「万能」的工厂类了: ?...来,我们接着来,除了工厂模式,策略模式也不妨试一试 ---- 策略模式 —— 它不香吗? 策略模式和工厂模式写起来其实区别也不大!策略模式也采用了面向对象的继承和多态机制。 ?...在上面工厂模式代码的基础上,按照策略模式的指导思想,我们也来创建一个所谓的策略上下文类,这里命名为RoleContext: class RoleContext { public: RoleContext...: 用模板技术进一步封装,使其不限制于角色类。

    1.2K10

    「C++ 篇」答应我,别再ifelse走天下了可以吗

    ---- 前言 羊哥之前写一篇有趣的文章《答应我,别再if/else走天下了可以吗 | CodeSheep 》,在文中使用 Java 语言实现了枚举类、工厂模式和策略模式的三种方式,来消除连环的if/...---- 工厂模式 —— 它不香吗? 不同的角色做不同的事情,很明显就提供了使用工厂模式的契机,我们只需要将不同情况单独定义好,并聚合到工厂里面即可。...下面的工厂类,改进了上面问题,同时采用模板技术,进一步对工厂类进行了封装,使得不管是角色类,还是其他类,只要存在多态特性的类,都可以使用此工厂类,可以说是「万能」的工厂类了: 「万能」工厂 接下来把新的...来,我们接着来,除了工厂模式,策略模式也不妨试一试 ---- 策略模式 —— 它不香吗? 策略模式和工厂模式写起来其实区别也不大!策略模式也采用了面向对象的继承和多态机制。...: 用模板技术进一步封装,使其不限制于角色类。

    63920

    php设计模式(二十三):策略模式(Strategy)

    这样我们不得写 N 中折扣模式,臃肿且使用最多的可能就那么几种,只是每个商家的价格模式不一样,那我们有没有一张策略能使每个商家都可以使用呢?...解决方法 我们可以使用策略模式,提供一个可替换的公共模板,每个商家可以在这个模式进行独家定制化,定制一套属于自己的方案,替换成自己的方案即可,这样既影响不到其他商家,也不会使整个软件臃肿。...阿这,这不是我们生活中常常遇到吗?提供一个模板给你,其他你自己来改,难不成这个是设计模式? 是的,其实设计模式和我们生活也息息相关,只是我们一直在做没有留意而已。...可以将算法的实现和使用算法的代码隔离开来。 可以使用组合来代替继承。 开闭原则。无需对上下文进行修改就能够引入新的策略。 缺点 如果的算法极少发生改变,那么没有任何理由引入新的类和接口。...使用这些函数的方式就和使用策略对象时完全相同,无需借助额外的类和接口来保持代码简洁。

    28810

    2个观点,带你重新理解设计模式

    设计模式使用类图来存储复杂的业务关系,使得开发者可以专注于业务逻辑的开发,所以说设计模式用于承载复杂的业务。 ? 如上图所示是策略模式的类图,Context 类是上下文类,在该类中初始化了具体的策略。...使用设计模式去承载复杂的业务逻辑,有好也有坏,但总体来说好处比较多。坏处就是对初学者非常不友好,可能他们完全看不懂代码。...好处则是熟悉设计模式的人,用设计模式可以一目了然地知道业务关系,它们使用设计模式作为语言来表达业务的关系。其次,各块代码之间相互隔离,稳定性、扩展性非常好。...经过这样的一番思考,我发现:所有设计模式的诞生,都是为了隔离变化。 在应用的时候,我们需要去分析需求中哪些是变化的,哪些是固定的。然后使用设计模式去承载变化的东西,封装固定的东西。...策略模式,变化的是这些具体的做法。 模板方法,变化的是具体的某个细节实现,不变的是整个流程算法。 访问者模式,变化的是不同的访问对象,不变的是我自身的处理流程(例如文件树的遍历)。

    67520

    真香系列:IPSec策略模板模式、模板模式、策略模式的区别

    众所周知,IPSec可以通过三种模式创建:流量策略模式、策略模板模式和配置文件模式 IPSec。那么,这三种模式有什么区别呢?它们的应用场景是什么,可以同时使用不同的方式建立IPSec VPN吗?...例如,对于大多数分支机构来说,静态 IP 地址是必需的。他们只是从 ISP 获得动态 IP。在这种场景下建立IPSec VPN,我们可以使用策略模板模式IPSec VPN。...策略模板模式 IPSec 使用流量策略模式IPSec 时需要两个静态IP 的原因是IPSec 对等体都可能发起IPSec VPN 的建立。...沿着这个思路,我们可以减少一个静态IP,只需要指定的peer来发起IPSec VPN的建立。这就是策略模板模式IPSec的思想。 图 1....策略模板模式 IPSec 例如,对于 Hub 和 Spoke 网络,我们可以在 Hub 对等体上配置 IPSec 策略模板,以便 Spoke 对等体发起 IPSec VPN 的建立。

    1.6K51

    设计模式--模板方法模式的思考

    模板方法模式 模板方法模式可以说是抽象类的一种特性,可以定义抽象(abstract)方法与常规方法,抽象方法延迟到子类中实现.因此标准的模板方法一般是一个抽象类+具体的实现子类,抽象类(AbstractClass...Mybatis中的模板方法模式 实际中由于模板方法很好的兼容性,因此经常与其他设计模式混用,并且在模板类之上增加一个接口来提高系统的灵活性.因此模板类经常作为中间层来使用,比如Mybatis的Executor...(stmt); handleWarnings(stmt); return result; ... } 因为篇幅原因,这里删减了很多代码,但是可以看出来这种方式实现有点策略模式的味道.其需要两个东西...这种模式的好处自然是灵活,通过策略接口可以把行为分离出来并且可以灵活的在运行时替换掉对应的行为,雨点策略模式的味道. 那么这种到底是策略模式还是模板方法模式呢?...我认为是 HashSet并不是专门为继承设计的类,因此去继承就出现了上述的问题.这么就代表代码中不应该使用继承吗?当然不是.

    57440

    为什么每个人都在谈论同构JavaScript 以及为什么它很重要

    用非同构策略修补这些问题充其量是很麻烦的。例如,在服务器端呈现页面早在同构JavaScript成为流行术语之前就是一种实践。...同样,另一种重要的策略涉及将爬虫重定向到运行Phantom等无头浏览器的独立机器.js.随着 Node.js 的出现,编写在浏览器和服务器上呈现的代码成为可能。...除了重用模板之外,开发人员还可以在服务器和浏览器上重用相同的库和实用程序,从而进一步减少对多余代码的需求。...在服务器和浏览器上拥有相同的库可以更好地开发和代码重用,从而使软件工程师更快乐,并减少维护代码所花费的时间。如果我们更进一步,我们甚至可以开发自己的内部模块,以便在浏览器和服务器之间共享。...此模块允许您的 Node.js 和 Express.js 驱动的应用程序向浏览器公开 Jade 模板,在那里它们可以被浏览器的 JavaScript 代码使用(我们在浏览器上使用 Backbone 和

    18310

    这就是模板方法?TemplateMethod,一个你一直都在用的设计模式!

    定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 它是一种行为型模式。 ” 这写的是啥?...模拟场景类图 代码实现 /** * 模板方法设计模式 * 范式重写的方法,系统帮我们自动调用的 * 都可以称之为模板方法 */ public class Main { public static...现在回过头来看一下,模板方法的定义: “定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。...它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。 它在父类中提取了公共的部分代码,便于代码复用。...欢迎阅读 浅析单例模式的8种写法 【设计模式】策略模式之“这不就是if-else吗” 【设计模式】工厂系列-FactoryMethod,AbstractFactory,Spring IOC 【设计模式】

    26310

    设计模式总篇:从为什么需要原则到实际落地(附知识图谱)

    写代码为什么需要设计原则 和机器人的三大定律相仿,几十年的编程经验,让几代人总结出来了一些代码设计上的定律,这就是设计模式的七大原则 我们遵循七大原则,一定会写出最完美的代码吗?...我自己想到的一句名言(以后或许可以成为名言~) 向着最好的方向去努力,总不会是最差的结果。...多用组合,少用继承 例如: 以单例模式和代理模式为例,它们都是该模式的最佳实践者,单例模式是把不同的策略接口通过组合的方式嵌入到Context类中,如代码所示: public abstract class...说明:在状态模式中,每一种状态的处理都是独立的一个类,每个类只需要处理自身的核心逻辑,完美体现了单一职责原则 里氏代换原则 ★★★★☆ 在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象...例如: 在代码设计场景中,某一个类的调用都会固定使用三个方法,是否可以考虑把三个方法抽取出来,提供一个公共的对外方法?

    49630

    设计模式总篇:从为什么需要原则到实际落地(附知识图谱)

    写代码为什么需要设计原则 和机器人的三大定律相仿,几十年的编程经验,让几代人总结出来了一些代码设计上的定律,这就是设计模式的七大原则 我们遵循七大原则,一定会写出最完美的代码吗?...我自己想到的一句名言(以后或许可以成为名言~) 向着最好的方向去努力,总不会是最差的结果。...多用组合,少用继承 例如: 以单例模式和代理模式为例,它们都是该模式的最佳实践者,单例模式是把不同的策略接口通过组合的方式嵌入到Context类中,如代码所示: public abstract class...说明:在状态模式中,每一种状态的处理都是独立的一个类,每个类只需要处理自身的核心逻辑,完美体现了单一职责原则 里氏代换原则 ★★★★☆ 在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象...例如: 在代码设计场景中,某一个类的调用都会固定使用三个方法,是否可以考虑把三个方法抽取出来,提供一个公共的对外方法?

    44640

    你说写代码,最常用的3个设计模式是啥?

    我已经录制完成了,那你有跟住学习打卡吗?...估计不少的读者在自己的实际开发中也会有这样的感受。 三、诊断:王者荣耀 你知道程咬金吗,嗯,就是那个王者荣耀里拿着两把西瓜刀贼猛的那个,他是三朝元老,经历了隋朝、唐朝、武周。...那这3个设计模式是哪3个呢,小傅哥推荐:模板 + 策略 + 工厂,只要这三个搞定,再搭配着使用,基本就能解决一大票问题,也能让你代码看上去非常有质量(你推荐哪3个设计模式,留言讨论)。...设计模式:模板 + 策略 + 工厂 其实这样的结构分层在 Spring 的源码中也有很多体现,它是一种解耦和职责边界分离的设计原则,通过这样的实现方式,让代码就是文档的体现。...而你实际的编码中,如果有类似这样的流程,也可以定义抽象的模板,提供数据支撑的继承和对应策略的配置以及调用处理。当然可能你的逻辑中不需要模板的使用,也可以直接是工厂 + 策略的组合。

    46720

    元旦这一天,很多程序员都做了这10个决定!

    当然,保持锋利比学习新的内容有更大意义。它也包括改善你使用日常工具的方式。我知道自己一直坚持使用熟悉的的模式和方法而不是学习在某个特定情形下更佳的方案是不对的。...你知道关于JavaScript设计模式的那些事吗?你对PHP的面向对象和面向功能编程是否有扎实的理解?你是否曾经使用过SQL连接?你使用的文本编辑器里是否有没有用过的功能?...这些都不是新技术,但是如果你不使用它们,它们对你来说就是全新的!也要在关注现有的语言和软件上预留一段时间。 3 探索一个新的领域 这项内容与第一项并不相同。...2018年,你为什么不更多的尝试参与到更多令人惊讶的团体中呢?例如博客或者其他社交网站分享自己的技术和代码,加入自由讨论会,用户组和各种会议。...这会困扰你吗?为便于以后工作,也为自己和其他人留下有用的注释。文档和注释是同样正确的事情。我最近在学习Dojo,我发现它的代码文档是无价的。

    581100

    设计模式

    组合模式使得树形结构中的每个节点都具有相同的抽象接口,整个结构可作为一个统一的抽象结构使用,而不暴露其内部表示。每个节点的任何操作,可以通过抽象基类中定义的相同接口来进行。...模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。核心思想就是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。其实,模板方法模式就是提供了一个很好的代码复用平台。...这样一方面提高了代码的复用性,另一方面还可以利用面向对象的多态性,在运行时选择一种具体子类 应用:-(void)drawRect:(CGRect)rect 模板模式和策略模式的不同点: (1)策略模式的应用场景...你需要行为的算法做很多变动。 客户端不知道算法使用的数据。 (2)模板模式的使用场景: 相同的算法放在一个类中(父类)将算法变化的部分放在子类中。 子类公共的算法放在一个公共类中,避免代码重复。...应用:策略模式demo 优点: 1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。

    34520

    Java中避免if-else-if:策略模式策略模式(Policy)总结

    我们使用if-else事实上也是为了重用,但这只是面向过程的重用,程序员只看到代码重用,因为他看到if-else几种情况下大部分代码都是重复的,只有个别不同,因此使用if-else可以避免重复代码,并且认为这是模板...将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。 实现的选择 Strategy模式可以提供相同行为的不同实现。...策略模式在实际工作中也很常用,在博客你还在用if-else吗有过很好的阐述,策略模式不仅是继承的代替方案,还能很好地解决if-else问题。下面结合本文之前的例子来说明一下如何使用策略模式。...将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。 实现的选择 Strategy模式可以提供相同行为的不同实现。...策略模式将造成产生很多策略类:可以通过使用享元模式在一定程度上减少对象的数量。 增加了对象的数目 Strategy增加了一个应用中的对象的数目。

    2.3K40

    北海 - Rust与面向对象(三)

    策略模式 上节说到,模板方法变化一下就能成策略模式,怎么变化的?...、Quack策略,参考下图,省略... /// 下图引用自 Oreilly.Head First Design Pattern 以上是策略模式的简单案例,策略模式可以说是模板方法的衍生变化。...还记得上一章中第一种模板方法的实现方式不,单看Fly就是模板方法:模板方法里子类完全不依赖父类,干净地完成算法策略,那子类就能够依赖注入到父类中;最好这种子类不止一个,比如不仅有Fly还有Quack,就是纯正的策略组合模式了...;另一方面,其它类型的Duck也需要子类化吗,若是的话岂不是又免不了类型爆炸了!策略模式这时正失去优雅的光环,它还是那个妙不可言的“策略模式”吗?...Rust语言,则可以静多态一路走到黑,Duck类型当参数时一直泛型约束使用下去。这样看起来,静多态是一种挺好的应对策略模式后续变化的解决方案。

    13510

    关于 Virtual SANVSAN 的常见问题解答

    • 问:VSAN必须要使用 10GbE 吗? 答:VSAN 并不强制要求使用 10GbE。VSAN也可以在较小的环境中(比如在实验室中)使用 1GbE 很好地运行。请注意,10GbE 是一个建议值。...我认为问题在于,为什么要将主机置于维护模式,以及主机多久可以再次使用。如果确实需要快速进入维护模式,并不在乎可能会丢失数据,则可以选择选项 3:回退。...请注意,当前 VSAN Beta 版许可证代码包括 DVS 和虚拟机存储策略,即使使用低于 Enterprise Plus 的 vSphere 许可证也是如此。...• 问:VSAN必须要使用 10GbE 吗? 答:VSAN 并不强制要求使用 10GbE。VSAN也可以在较小的环境中(比如在实验室中)使用 1GbE 很好地运行。请注意,10GbE 是一个建议值。...请注意,当前 VSAN Beta 版许可证代码包括 DVS 和虚拟机存储策略,即使使用低于 Enterprise Plus 的 vSphere 许可证也是如此。

    2.4K20
    领券