设计模式:第一篇--策略模式

策略模式:定义了算法族,分别封装起来,让算法族下的算法之间可以被替换。策略模式将算法独立于使用算法的客户之外。

其实我们已经学会了策略模式了。在上一篇最后使用的其实就是策略模式。回去翻一下会发现,我们把鸭子的行为(算法族)封装起来,给行为具体实现(算法)。组合行为(算法族)到鸭子上实现动态可以动态改变行为(算法)。这不就是策略模式吗。本篇我们找个实际应用到的例子。

JDK8的java.util.function包下提供了一系列算法族。其实接口Supplier、Predicate、Consumer、Function这些我们在学习jdk8特性的时候会接触到。因为jdk8最大一个设计就是函数式编程了。其实其中就大量用到了策略模式。只不过不同的是,我们之前是提前将实现写好放到一个类里面,这里是直接匿名实现。当成参数传递下去。这一系列接口出来之后,感觉没有比这些更简单的策略模式实例了。简直一目了然。

最简单的例子:Consumer

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);

    /**
     * Returns a composed {@code Consumer} that performs, in sequence, this
     * operation followed by the {@code after} operation. If performing either
     * operation throws an exception, it is relayed to the caller of the
     * composed operation.  If performing this operation throws an exception,
     * the {@code after} operation will not be performed.
     *
     * @param after the operation to perform after this operation
     * @return a composed {@code Consumer} that performs in sequence this
     * operation followed by the {@code after} operation
     * @throws NullPointerException if {@code after} is null
     */
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

我们看到Consumer接口写了两个方法。一个是accept另一个是andThen。其中andThen已经提供了默认实现。而accept则没有。因此该接口的子类是都要要求实现accept方法的。该接口定义了一个Consumer算法族。接收一个T类型的参数t,并实现自定义逻辑。

最简单明了的使用

public class DemoTest {

    @Test
    public void test() {

        //定义五个策略:每个策略实现一个算法
        Consumer<String> strategy1 = o -> System.out.println("算法1:" + o);
        Consumer<String> strategy2 = o -> System.out.println("算法2:" + o);
        Consumer<String> strategy3 = o -> System.out.println("算法3:" + o);
        Consumer<String> strategy4 = o -> System.out.println("算法4:" + o);
        Consumer<String> strategy5 = o -> System.out.println("算法5:" + o);

        //执行算法
        strategy1.accept("参数1");
        strategy2.accept("参数2");
        strategy3.accept("参数3");
        strategy4.accept("参数4");
        strategy5.accept("参数5");
        
    }
    
}

可以说代码是很清晰了,定义了五个策略实现每个策略的算法,然后执行。如果没有这么写过代码没关系。看下面这段。

public class DemoTest {

    @Test
    public void test() {
        
        strategy(t -> System.out.println("算法" + t + ":参数" + t),"1");
        strategy(t -> System.out.println("算法" + t + ":参数" + t),"2");
        strategy(t -> System.out.println("算法" + t + ":参数" + t),"3");
        strategy(t -> System.out.println("算法" + t + ":参数" + t),"4");
        strategy(t -> System.out.println("算法" + t + ":参数" + t),"5");

    }

    /**
     * 策略
     * @param consumer
     * @param t
     * @param <T>
     */
    public <T> void strategy(Consumer<T> consumer,T t) {
        consumer.accept(t);
    }

}

定义了一个参数类型为Consumer算法族接口,在待用的的时候传入实现(算法),并传入需要的参数。这就形成了一个策略。然后该接口调用方法accept去执行策略。整个策略模式的核心就是将动态实现算法族的算法,抽象的不是参数,而是实现和算法。是不是很简单。没有复杂的UML,没有一大堆类。实际应用就这么简单就可以使用了。简直没有比这跟简单的策略模式案例了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,737评论 0 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,922评论 1 15
  • 哭殷遥 唐代 王维 人生能几何,毕竟归无形。 念君等为死,万事伤人情。 慈母未及葬,一女才十龄。 泱漭寒郊外,萧...
    境心园阅读 677评论 1 0
  • 情绪:欣喜 情绪来源: 大家都知道我是做大学生创业孵化器的,最近又接了很多单,但现在同学们都放假了,我就试探性的在...
    顽伴高振裕阅读 116评论 2 1