策略模式

策略模式的孪生兄弟——对状态模式的深度复习总结

五迷三道 提交于 2020-01-20 08:58:49
前言 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂逻辑判断的,那么他们有什么不同呢? 回忆状态模式—— 策略模式的孪生兄弟——对状态模式的深度复习总结 :状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象表现得就好像修改了它的类一样。 状态模式的关键是各个状态子类必须知道下一个状态是什么 , 且要把逻辑判断转移到各个状态子类中,客户端不需要了解状态迁移的顺序。 状态模式虽然类图和策略模式几乎一样,但是策略模式的目的是针对单一算法,在运行时能替换,客户端需要事先了解策略,主动去选择合适的策略,不存在状态的自动迁移。 下面总结复习职责链模式。 责任链(职责链,Chain of Responsibility(CoR))概述 责任链,Chain of Responsibility(CoR),也叫职责链模式或者职责连锁模式,同状态模式一样,也是对象的行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,对象由每一个对象对其下家的引用而连接起来形成一条链,客户端发出的请求在这个链上传递,直到链上的某一个对象决定能处理此请求。 注意:发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,所以该模式被称作职责链模式。 责任链模式的特点

spring+策略模式

懵懂的女人 提交于 2020-01-19 00:14:56
需求: 这里虚拟一个业务需求,让大家容易理解。假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理。 1. 常规代码实现 1.1 实体类 import lombok.Data; import java.math.BigDecimal; @Data public class OrderDTO { private String code; private BigDecimal price; /** * 订单类型 * 1: 普通订单 * 2: 团购订单 * 3: 促销订单 */ private String type; } 1.2 接口类 import qinfeng.zheng.strategy.dto.OrderDTO; public interface IOrderService { /** * 根据订单类型做出相应的处理 * * @param orderDTO * @return */ String handle(OrderDTO orderDTO); } 1.3 接口实现 import org.springframework.stereotype.Service; import qinfeng.zheng.strategy.dto.OrderDTO; import qinfeng.zheng.strategy.service.IOrderService;

策略模式-三十六计

两盒软妹~` 提交于 2020-01-18 14:34:21
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中。从而使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。 策略模式用法1 在一场战争中,一个伟大的将领需要根据敌人的数量,巧妙的使用各种计谋,来获取战争的胜利。将不同的计谋封装到单独的Stratagem类中,每个计谋有他们可以战胜的敌人个数。战争Warfare开始之前,将领需要根据自己对战场形势的判断,传入不同的计谋。 package strategy_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-18 12:55 * @notify * @version 1.0 */ public interface Stratagem { void killEnemy(); } View Code package strategy_k;/* * @auther 顶风少年 * @mail dfsn19970313@foxmail.com * @date 2020-01-18 12:57 * @notify * @version 1.0 */ public class OneStratagem implements Stratagem{ @Override public void

策略模式

和自甴很熟 提交于 2020-01-18 01:16:45
个人博客 http://www.milovetingting.cn 策略模式 模式介绍 实现某一个功能有多种算法或者策略,可以根据实际情况选择不同的算法或者策略来实现该功能,如果将这些算法或者策略抽象出来,提供一个统一的接口,不同的算法或策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态替换,这种模式的可扩展性,可维护性更高。这就是策略模式。 模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 使用场景 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时 需要安全地封装多种同一类型的操作时 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。 定义策略接口类 public interface Strategy { int calc ( ) ; } 定义具体的策略实现类 public class Strategy1 implements Strategy { @Override public int calc ( ) { System . out . println ( "Strategy1" ) ; return 1 ; } } public class Strategy2 implements Strategy {

策略模式之if else代码优化

梦想与她 提交于 2020-01-16 00:31:48
一、概念   策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。 if else使用 if ( pageLevel = "1" ) { // 发送get请求 } else if ( pageLevel = "2" ) { // 发送post请求 } else { // }   这种if else代码块中,代码很难维护也很也不够美观,那么我们可以使用策略模式来处理这种情况。 二、案例   简单来讲就是定义一个接口,然后有多个实现类,每种实现类封装了一种行为。然后根据条件的不同选择不同的实现类。 抽象业务接口 public interface SendRequestCenter { public abstract void solve ( String param ) ; public abstract String [ ] supports ( ) ; } 接口实现类,举例:一个发送get请求,一个发送post请求 import org . springframework . stereotype . Component ; @Component public class SendPostRequestSolver implements SendRequestCenter {

实际应用场景策略模式使用总结

非 Y 不嫁゛ 提交于 2020-01-14 18:30:01
背景:在给第三方推送表单数据时候,需要分多种方式进行传送,比如区分传送协议,传送参数,传送token等等,此时为了避免代码的重复和冗余,以及后期的扩展性和维护性,合理的利用策略模式可以很好的解决这个问题 协议包括:HTTP,HESSIAN,WEBSERVICE 参数:部分地址需要token进行验证身份,部分需要header参数,部分需要定制化的参数 传输方式:json对象,object对象 逻辑具体如下图 策略类部分代码: public class StrategerExecutor { private ActionExecutor actionExecutor; public StrategerExecutor(ActionExecutor actionExecutor) { this.actionExecutor = actionExecutor; } public Object executor ()throws Exception{ return actionExecutor.execute(); } } interface接口部分代码: public interface ActionExecutor { /** * 业务执行方法 * @return */ public Object execute() throws Exception; } 客户端部分代码:

java设计模式--策略(2)

℡╲_俬逩灬. 提交于 2020-01-14 04:35:13
前景 已静态工厂+策略 处理多重if判断 项目演示地址 先看最终调用代码 @RestController public class DemoController { @PostMapping ( value = "/strategy/factory/pay" ) public String pay ( @RequestParam String payType ) { StrategyFactory strategyFactory = StrategyFactory . getInstance ( ) ; Pay pay = strategyFactory . get ( payType ) ; String call = pay . call ( ) ; System . out . println ( call ) ; return pay . call ( ) ; } } 定义公用接口 public interface Pay { String call ( ) ; String getType ( ) ; } public class AliPay implements Pay { @Override public String call ( ) { System . out . println ( "调用支付宝" ) ; return "ali" ; } @Override

《Linux就该这么学》培训笔记_ch08_iptables与firewall防火墙

本秂侑毒 提交于 2020-01-13 12:04:04
《Linux就该这么学》培训笔记_ch08_iptables与firewall防火墙 文章最后会post上书本的笔记照片。 文章主要内容 : 防火墙管理工具 iptables firewalld 服务的访问控制列表 书本笔记 防火墙管理工具 防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。 防火墙策略可以 基于流量的源目地址、端口号、协议、应用 等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。 在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,只需要配置妥当其中的一个就足够。 iptables与firewalld只是用来定义防火墙策略的防火墙管理工具,并不是真正的防火墙。或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。 iptables 在早期的Linux系统中(RHEL7之前),默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用iptables

精妙绝伦的设计模式:策略模式+模板模式

荒凉一梦 提交于 2020-01-13 07:02:50
还是以经典的会员价格策略为依托场景; 一、首先加入maven依赖,此依赖用于扫描并获取特定含有特定注解的类 二、定义个一个自定义注解,用来定义并判断价格区间 三、写一个策略接口类,用于定义获取折后价格的抽象方法 四、写一个抽象类,用来实现策略接口中的方法,并且将公共的前置判断逻辑放在此抽象类中(此为模板设计模式),并定义好抽象方法calcPrice()让各自的策略类中去实现 五、各自的策略类:Ordinary(普通用户),Member(会员 6折),SuperMember(超级会员,4折),都需要继承公共的模板类AbstractPrice 六、写一个工厂类,所有的策略类将注入到这个类中 七、写一个上下文类,用于获取具体的策略类实例,并执行对应策略类实例的计算方法: 测试: 来源: CSDN 作者: 爱码僧 链接: https://blog.csdn.net/qq_33666602/article/details/103748277

php设计模式-策略模式

喜夏-厌秋 提交于 2020-01-13 00:31:21
PHP策略模式 1、什么是策略模式? 定义: 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,并让它们可以相互替换,这种模式就是策略模式。 简单理解就是 有n个做法供你选择,根据你的需要选择某个策略得到结果 2、为什么要用策略模式? 使用设计模式之后,我们的 代码冗余和耦合度变低,每个策略模块完成对应的功能 。 当然缺点就是一个功能我们就要响应制作一个策略类,但是我们统观MVC架构当中(ThinkPHP,Yii2),一个控制器对应一个视图,其实也是策略设计模式的体现了。 3、示例代码 业务场景 在一个电商网站中,根据用户的性别来展示不同的商品。我们有展示商品的类目(function showCategory())和展示的广告(function showAd()) 实现方式 首先我们要定义一个接口,接口中定义需要实现的方法。 然后分别定义不同的类来实现接口中的方法。 最后在根据用户的不同,分别 new 不同的方法。 /** * @purpose: 父类接口 * Interface UserInterface */ interface UserInterface { /** * @purpose: 展示广告 * @return mixed */ public function showAd(); /** * @purpose: 展示商品分类 * @return mixed