策略模式

23种设计模式——策略模式(Strategy)

爱⌒轻易说出口 提交于 2019-12-17 18:56:31
一、策略模式 策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。比如出行方式,可以选择骑自行车、坐公交车、打车、开车等等,每种出行方式都是一个策略。 二、策略模式的应用 1.使用场景 针对同一类型的问题,有多种处理方式,每一种都能独立解决问题且区分它们的只是它们直接的行为。算法需要自由切换的场景。需要屏蔽算法规则的场景。 2.使用方式 strategy类,定义所有支持的算法的公共接口。 concreteStrategy,封装具体的方法或行为,继承strategy类。 context,用一个concreteStrategy来配置,维护一个对strategy的引用。 简单工厂或枚举类生成Context对象。 3.主要解决 有多种算法相似的情况下,大量使用if else为程序带啦的负责性和臃肿性。 4.优点 算法的多样性,且具备自由切换场景。有效避免多重条件判断,增强了封装性,简化的操作,降低出错概率。扩展性良好,策略类遵循里氏替换原则,可以很方便的进行策略扩展。 5.缺点 策略类数量增多,每个策略都是一个类,复用的可能性很小。所有策略类必须对外暴露,以便客户端能够选择。 6.注意事项 如果一个系统的策略多于四个,就需要考虑使用混合模式来解决策略膨胀的问题。 三、策略模式的实现 1.strategy public abstract class

设计模式再学习(下)

前提是你 提交于 2019-12-17 13:05:47
理解设计模式前的前堤: 1、模式的应用目标是把可维护性作为很重要指标的程序,像一次性的Demo程序就不需要多高的可维护性; 2、意识到并认可面向接口编程的好处,不认可请回看1; 3、设计模式的本质是解耦,解耦的根本手段是分层,分的层越多,关系越不直观; 4、不用设计模式完全不影响实现需求,只是写的代码多了,重构多了,写着写着,也就进入了设计模式的“窠臼”。 行为型模式 模板方法模式 模板方法也是用得很多的一种模式,尤其是在重构系统时。当你在两个以上相同的类,代码几乎一模一样,只有少许区别时,就要考虑是否用模板方法模式进行重构。父类定好算法步骤,通常将变化的部分封装成abstract方法,由子类实现该abstract方法。从另一个角度来看模板方法,其实它是对面向对象多态的补充,试想一下,多态是父类(接口)定好接口,子类分别实现之,可现实情况并不会总是如此简单,有些是可复用的部分,让每个子类各自重复实现这些可复用的代码明显是有问题的,重构方法就是把这部分可复用的代码前置到父类去写一份即可,那重构后不就是模板方法的应用了么?缺点就是父类调用子类方法,会增加调试的复杂性。 策略模式 既然是策略,那就是对调用方暴露的,即调用方需要了解有哪些策略。面向接口编程使得策略之间可以互相替换,变化部分通过策略类封装起来,也就意味着一个事情可以有多种实现方案,在使用if..

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

南笙酒味 提交于 2019-12-16 18:09:49
策略模式 Strategy (行为型模式) 1.概述 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 2.问题 如何让算法和对象分开来,降低他们之间的耦合度,使得算法可以独立于使用它的客户而变化? 3.解决方案 策略模式:它定义了一系列算法,把每一个算法封装起来,让它们之间可以相互替换,本模式使得算法可独立于使用它的客户而变化。 4.结构 5.例子 商场收银软件:营业员根据顾客所购买商品的单价和数量,计算总价。商场可能会有促销活动,比如全场打8折,全场打5折,买200返100等。 实现方式一:可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的打折算法;当然也可以将这些打折算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的打折算法,需要修改封装算法类的源代码。该类代码将较复杂,维护较为困难。 如果需要修改或者新增算法,需要修改原有的类,违反了 开闭原则 ,系统的灵活性和可扩展性差。 算法的复用性较差,无法重用某些算法。 实现方式二:使用策略模式。代码如下: 1 package strategy; 2 /* 3 * 策略类 4 */ 5 public

策略模式

南笙酒味 提交于 2019-12-13 15:17:55
在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。 在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。 如果使用多重条件转移语句实现(即硬编码),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,违背开闭原则。如果采用策略模式就能很好解决该问题。 策略模式的定义与特点 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 策略模式的主要优点如下。 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。 策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。 策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。

开源规则流引擎实践

╄→尐↘猪︶ㄣ 提交于 2019-12-11 16:58:51
阅读更多 前言 在很多企业的 IT 业务系统中,经常会有大量的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改。为了适应这样的需求,我们的 IT 业务系统应该能快速且低成本的更新。适应这样的需求,一般的作法是将业务规则的配置单独拿出来,使之与业务系统保持低耦合。目前,实现这样的功能的程序,已经被开发成为规则引擎。 规则引擎是一种推理引擎,它是根据已有的事实,从规则知识库中匹配规则,并处理存在冲突的规则,执行最后筛选通过的规则。因此,规则引擎是人工智能(AI)研究领域的一部分,具有一定的选择判断性、人工智能性和富含知识性。目前,比较流行的规则引擎有商业规则引擎 iLog 和开源规则引擎 drools。本文将对开源规则引擎 drools 做详细介绍,并通过分析一个在汽车保险行业中的实际应用案例,让读者对开源规则流引擎有一个更深刻的理解。 1. 基于 rete 算法的规则引擎 在 AI 领域,产生式系统是一个很重要的理论,产生式推理分为正向推理和逆向推理产生式,其规则的一般形式是:IF 条件 THEN 操作。rete 算法是实现产生式系统中正向推理的高效模式匹配算法,通过形成一个 rete 网络进行模式匹配,利用基于规则的系统的时间冗余性和结构相似性特征 [8],提高系统模式匹配效率。本文将介绍的 Drools 引擎就是利用 rete 算法对规则进行分析,形成

js设计模式--策略模式

此生再无相见时 提交于 2019-12-10 18:21:49
概念 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 策略模式指的是定义一系列的算法,把它们一个个封装起来。将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来。 一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体 的算法,并负责具体的计算过程。 第二个部分是环境类Context,Context 接受客户的请求,随后 把请求委托给某一个策略类。要做到这点,说明 Context中要维持对某个策略对象的引用。 策略模式的实现并不复杂,关键是如何从策略模式的实现背后,找到封装变化、委托和多态性这些思想的价值。 场景 从定义上看,策略模式就是用来封装算法的。但如果把策略模式仅仅用来封装算法,未免有一点大材小用。在实际开发中,我们通常会把算法的含义扩散开来,使策略模式也可以用来封装 一系列的“业务规则”。只要这些业务规则指向的目标一致,并且可以被替换使用,我们就可以 用策略模式来封装它们。 优缺点 优点 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。 策略模式中的算法也可以复用在系统的其他地方

设计模式(Hibernate)

拈花ヽ惹草 提交于 2019-12-10 08:44:09
1、概述 2、面向对象设计原则 1)单一职责原则 2)开闭原则 3)里氏替换原则 4)依赖倒置原则 5)接口隔离原则 6)迪米特原则 7)组合/聚合复用原则 3、设计模式 4、设计模式分类 5、简单工厂模式 样例: 产品接口类(Product): package com.ljb.simplefactory; /** * 产品接口 * @author LJB * @version 2015年4月21日 */ public interface Product { /**产品生产工艺*/ public void craftwork(); /**产品特征*/ public void type(); } 产品类(鲜奶): package com.ljb.simplefactory; /** * 鲜奶 * @author LJB * @version 2015年4月21日 */ public class Creamery implements Product { @Override public void craftwork() { System.out.println("牛奶+除菌=鲜奶"); } @Override public void type() { System.out.println("原味浓香"); } } 产品类(酸奶): package com.ljb

开源规则流引擎实践

两盒软妹~` 提交于 2019-12-10 01:25:39
1. 基于 rete 算法的规则引擎 在 AI 领域,产生式系统是一个很重要的理论,产生式推理分为正向推理和逆向推理产生式,其规则的一般形式是:IF 条件 THEN 操作。rete 算法是实现产生式系统中正向推理的高效模式匹配算法,通过形成一个 rete 网络进行模式匹配,利用基于规则的系统的时间冗余性和结构相似性特征 [8],提高系统模式匹配效率。本文将介绍的 Drools 引擎就是利用 rete 算法对规则进行分析,形成 rete 网络,对模式进行匹配。 1.1 rete 算法研究 1.1.1 rete 算法概述 Rete 算法最初是由卡内基梅隆大学的 Charles L.Forgy 博士在 1974 年发表的论文中所阐述的算法 , 该算法提供了专家系统的一个高效实现。自 Rete 算法提出以后 , 它就被用到一些大型的规则系统中 , 像 ILog、Jess、JBoss Rules 等都是基于 RETE 算法的规则引擎 [7] 。 Rete 在拉丁语中译为”net”,即网络。Rete 匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。 其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果。Rete 算法可以被分为两个部分:规则编译和规则执行 [7] 。当 Rete 算法进行事实的断言时

策略模式 和 工厂模式的区别

我是研究僧i 提交于 2019-12-08 23:08:33
目录 策略模式 Strategy Pattern 首先介绍一下策略模式: 策略模式特点 工厂模式 工厂模式特点 策略模式 Strategy Pattern 首先介绍一下策略模式: 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化; 策略模式特点 一个类的行为或者算法可以在 运行时 更改 解决的问题 解决在一个环境下,要多种方法切换的时候,用if else麻烦。【我的理解是:如果我原来用的A算法,现在改成B,最简单的方法是,直接把 a = A算法;的下一行写成 a = B算法;一般来说,改算法要重新写代码之类的,策略模式不用,直接用生成策略法解决】 工厂模式 工厂模式特点 隐藏内部生成逻辑,用一个共同接口,生成需要的子类。 来源: https://www.cnblogs.com/mengxixi/p/12008513.html

案例分析:设计模式与代码的结构特性

一个人想着一个人 提交于 2019-12-07 18:43:28
我选择的软件设计模式为策略模式(strategy pattern) 一、策略模式 意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决: 将这些算法封装成一个一个的类,任意地替换。 关键代码: 实现同一个接口。 应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。 注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。 二、引用关键代码解释该设计模式在该应用场景中的适用性