策略模式

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

断了今生、忘了曾经 提交于 2019-11-30 07:01:35
转载文章地址: https://www.jianshu.com/p/3bcf55cf83d3 一、业务场景: 1、有一个鸟类,鸟有共同的属性,比如飞和叫,不同的叫声,可以通过子类重写父类的方法进行,当业务扩展,鸟还有进食的属性,     但是不同的鸟类,吃的东西不一样,就比如有的类中,不需要此方法,该怎么解决呢?a.子类重写父类方法,但是当有多个类实现时,     修改比较麻烦,b.定义吃的统一接口,不同的吃的食物方式实现吃的统一接口,当不同种类的鸟进食时,调用不同的实现类,实现不同     类的鸟进行不同吃的方式;   2、当一个旧的类,需要在主类中添加一个方法,所有的子类继承之后,都会调用这个方法,但是并不是所有的子类都需要实现这个方法,这时候就需要想新的办法了:     1 )、在每个子类中去重写这个新方法 --- 》太麻烦,而且代码复用性不高,     2 )、定义有一个行为( interface ),行为的具体实现方式不一样,列入鸭子叫: Gaga 叫、 gugu 叫,子类实现的具体行为不一样,则最终表达的方式就不一样 二、类图 三、实现通用代码: class Client { public static void main(String[] args) { //选择一个具体策略 IStrategy strategy = new ConcreteStrategyA();

策略模式

安稳与你 提交于 2019-11-30 06:08:37
一、概要 策略模式:将每一个算法封装到具体公共接口的独立类中,使用多态的方式,调用实际的算法,避免if else 二、角色 1.环境角色:持有一个Strategy引用 2.抽象策略角色:此角色给所有具体策略类所需要的接口方法 3.具体策略角色:包装了相关的算法和行为 三、使用场景 算法一:对初级会员没有折扣。 算法二:对中级会员提供10%的促销折扣。 算法三:对高级会员提供20%的促销折扣。 使用策略模式来实现的结构图如下: 四、实现代码 1.抽象策略角色 2.具体策略角色 2.1 初级会员 2.2 中级会员 2.3 高级会员 3.环境角色 4.客户端具体调用算法 优点: 1.策略模式提供了管理算法的方法,用继承把公共的代码移到父类,避免代码重复 2.避免使用if,else语句。多重条件语句不易维护。 缺点: 1.策略很多的话,那对象的数目就会很可观 来源: https://blog.csdn.net/qq_36432147/article/details/101145266

设计模式之策略模式

倾然丶 夕夏残阳落幕 提交于 2019-11-30 02:50:53
策略模式概念 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换, 此模式让算法的变化不会影响到使用算法的客户。 策略模式作用: 1.所有的这些算法都是做相同的事情,只是实现不同 2.以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合 3.单独定义算法类,也方便了单元测试 注意事项 1.不仅可以封装算法,也可以用来封装几乎任何类型的规则,是要在分析过程中 需要在不同时间应用不同的业务规则,就可以考虑是要策略模式来处理各种变化 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> var $input = $('#input').val(); /* var val = { isEmpty:function(){ return false; }, isTel:function(){ return true; } } var ise = val

设计模式——策略模式

做~自己de王妃 提交于 2019-11-29 18:48:45
定义 其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能 类图 实例 毕业季,同学们面临很多选择: 工作、出国深造、考研... Michael刚开始的时候选择的工作,但是工作两年之后发现还是热爱科研,然后选择了考研,使用策略模式该如何实现呢? 主体Context: package com.ytj.demo.design.patterns.strategy; /** * Context * * @version V1.0.0 * @program: testMaven * @description: Context * @date 2019/9/10 13:14 */ class Context { private IStrategy strategy; private String name; Context(IStrategy strategy, String name) { this.strategy = strategy; this.name = name; } /** * 毕业选择 */ void developmentAfterGraduate() { System.err.println(name + "选择是: "); strategy

策略模式

落花浮王杯 提交于 2019-11-29 16:43:38
策略模式采用组合的形式,把一个算法任务委托给被组合的接口,根据运行时传入对象的不同,算法可以做到相互替换,同时这些变化可以独立于具体的使用者。 例如,一般车上都会有喇叭,不同的车喇叭的声音不一样,将车抽象成一个接口如下: 1 public interface Vehicle{ 2 void whistle(); //鸣笛 3 } 我们都知道,自行车按铃是“铃铃铃”的声音,而小汽车则是“嘀嘀”声,它们都实现了Vehicle接口: 1 public class Bike implements Vehicle{ 2 public void whistle(){ 3 System.out.println("铃铃铃。。。"); 4 } 5 } 6 7 public class implements Vehicle{ 8 public void whistle(){ 9 System.out.println("嘀嘀。。。"); 10 } 11 } 现在,自行车和小汽车都能够正常的鸣笛了。然而,这种类结构有一个问题,假设小汽车的喇叭坏了,这个时候调用它的 whistle 方法没有发出任何声音,我们需要换一个喇叭。然而由于 whistle 方法是与具体的车(Car)绑定在一起了,要换喇叭,只能连车一起换了,这显然不划算,所以需要将喇叭与车进行重新设计,让喇叭只是作为车里面的一个可以随时更换的配件

策略模式原来这么简单!

僤鯓⒐⒋嵵緔 提交于 2019-11-29 10:46:16
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 无论是面试还是个人的提升,设计模式是必学的。今天来讲解 策略 模式~ 一、策略模式介绍 我一次听到策略模式这个词,是在我初学JDBC的时候。不知道大家有没有用过DBUtils这个组件。当时初学跟着视频学习,方立勋老师首先是让我们先自己封装一下JDBC的一些常用的操作(实际上就是模仿DBUtils这个组件)。 当时候的问题是这样的:我们打算封装一下 query() 查询方法,传入的参数有 String sql , Object[] objects (指定SQL语句和对应的参数)。我们想根据 不同的业务 返回不同的值。 比如说,有的时候我们返回的是一条数据,那我们想将这条数据封装成一个Bean对象 比如说,有的时候我们返回的是多条数据,那我们想将这多条数据封装成一个 List<Bean> 集合 比如说,有的时候我们返回的是xxxx数据,那我们想将这多条数据封装成一个 Map<Bean> 集合 ........等等等 当时解决方案是这样的: 先定义一个接口:ResultSetHandler( 调用者想要对结果集进行什么操作,只要实现这个接口即可 ) 这个接口定义了行为。 Object hanlder(ResultSet resultSet);

图解设计模式(11) 策略模式

泪湿孤枕 提交于 2019-11-29 06:49:33
一、 应用场景 商场对于不同的客户采用不同的打折策略; 施工对于不同的地形地貌采用不同的施工方法;数据处理针对不同批量的数据选取不同的算法等。 对于常用的 if() { }else if(){ }else if(){ }else{} 结构,可以采用策略模式来重构。 当增加新的模式时,不需要修改原有的代码,符合开闭原则。 它可以算法与架构分离。 二、具体实现 实现要点 1. 一个Strategy interface, 在其中定义要实现的方法。 2. 多个具体的Strategy类,implements interface, 在其中实现不同的算法。 3.一个上下文类 Context, 其中包含Strategy 对象,可以选择不同的具体策略类来处理业务。 代码实现 以超市打折策略为例,新客户买的少不打折;新客户买的多打9折;老客户买的少打9折;老客户买的多打8折。 1. Strategy接口,规定要实现的方法。 public interface Strategy { double getPrice(double originalPrice); } 2. 不同的策略, implements interface public class NewCustomerFew implements Strategy { @Override public double getPrice(double

设计模式之间的对比

青春壹個敷衍的年華 提交于 2019-11-29 05:09:59
第一、设计模式之间的关联关系和对比 1.1单例模式和工厂模式 实际业务代码中,通常会把工厂类设计为单例。 1.2策略模式和工厂模式 1.工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式属于行为型模式。 2.工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为。 1.3策略模式和委派模式 1、策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。 2、委派模式更关注分发和调度的过程。 模板方法模式和工厂方法模式工厂方法是模板方法的一种特殊实现。 工厂方法模式 模板方法模式 对于工厂方法模式的 create()方法而言,相当于只有一个步骤的模板方法模式。这一个步骤交给子类去实现。而模板方法呢, 将 needHomework()方法和 checkHomework()方法交给子类实现,needHomework()方法和 checkHomework()方法又属于父类的某一个步骤且不可变更。 1.4模板方法和策略模式 1、模板方法和策略模式都有封装算法。 2、策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。 3、模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。 4、模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通常用来代替 if...else...等条件分支语句。 策略模式

策略模式

你离开我真会死。 提交于 2019-11-29 04:45:00
public interface HandlerMapResolver<K, V, R> { boolean support(K key, V value); R resolve(K key, V value); } import java.util.Collections; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; @Slf4j @RequiredArgsConstructor public class HandlerKafkaMessageResolverComposite { private final List<HandlerMapResolver> resolvers; public List<ObjectId> resolve(String key, String value) { for (HandlerMapResolver resolver : this.resolvers) { if (resolver.support(key, value)) { return (List<ObjectId>)resolver.resolve(key, value);

策略模式

只愿长相守 提交于 2019-11-29 03:24:15
1、策略模式 :策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作, 只是实现不同,他可以以相同的方式来调用所有的算法,减少了各种算法类与使用算法类之间的耦合。 2、题目 :做一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费,收费模式分三种:第一种,正常收费; 第二种,打8折;第三种,满300送100; 3、UML图 : 4、示例代码 : 4.1、抽象算法类: CashSuper类: package com.aibaiyang.idemo.service.strategy; /** * @Author zhong guo * @Date 2019/8/30 11:44 * @description 抽象算法类 **/ public abstract class CashSuper { //现金收取算法方法 public abstract double acceptCash(double money); } View Code CashNormal类: package com.aibaiyang.idemo.service.strategy; /** * @Author zhong guo * @Date 2019/8/30 11:50 * @description 正常收费 **/ public class CashNormal