一看就懂的设计模式--策略模式

是什么?

策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
分析下定义:策略模式定义和封装了一系列的算法,它们是可以相互替换的,也就是说它们具有共性,而它们的共性就体现在策略接口的行为上,另外为了达到最后一句话的目的,也就是说让算法独立于使用它的客户而独立变化,我们需要让客户端依赖于策略接口。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

类别

行为型模式

类图

策略模式类图

适用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

关键

所有的算法(行为)继承一个接口或抽象类,定义好共同的方法。具体的实现在具体的实现类中编写。然后在Content类中使用这个接口,也即是依赖这个接口。Content类中定义一个执行算法的方法,用接口.算法, 这个按照面向接口编程的方式。就能在不同场景执行不同策略(算法、行为)。

注意事项

如果一个系统的策略多于四个,就需要考虑使用混合模式,比如和享元模式结合,把常用的算法(也就是行为)类,用享元模式封装。

常见案例

1、jdk中的 Arrays的排序方法就是用了策略模式,Arrays.sort(排序策略),传入不同的排序策略就会出现不同的 排序结果,比如传入字典方式排序、从小到大排序,从大到下排序等等。

优点

1、算法可以自由切换。
2、避免使用多重条件判断。(一个方法中有和多if else,这时候就可以把这方法里的具体逻辑用策略模式封装了,用户使用 时候直接传入对应的策略就行。就算加了新的策略,也不需要改 if else)
3、扩展性良好。。

缺点

1、策略类会增多。
2、所有策略类都需要对外暴露。

实现步骤

步骤 1

创建一个接口,所有策略的共同接口,他定义了策略方法

package com.pattern.strategy_pattern;

/**
 * Created by chen on 2018/3/29.
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe: 算法策略的接口,这里定义算法的抽象方法
 */
public interface Strategy {

    /**
     * 对两个整数 做运算
     *
     * @param a
     * @param b
     */
    void algorithm(int a, int b);
}


步骤 2

把具体的策略,实现起来,继承接口,实现接口定义的方法,也即是写具体的业务逻辑


//   加法运算策略

package com.pattern.strategy_pattern;

/**
 * @author chen
 * @date 2018/3/29
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe: 加法运算
 */
public class AdditionStrategy implements Strategy {
    @Override
    public void algorithm(int a, int b) {
        System.out.println("加法运算 a+b=" + (a + b));
    }
}



//   减法运算策略

package com.pattern.strategy_pattern;

/**
 * @author chen
 * @date 2018/3/29
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe: 减法运算
 */
public class SubstractStrategy implements Strategy {
    @Override
    public void algorithm(int a, int b) {
        System.out.println("减法运行 a-b=" + (a - b));
    }
}


步骤3

创建一个Content类,引入策略接口,执行策略方法。

package com.pattern.strategy_pattern;

/**
 * Created by chen on 2018/3/29.
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:
 */
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 根据strategy的类型 执行 对应的 策略
     * @param a
     * @param b
     */
    public void executeStrategy(int a, int b) {
        strategy.algorithm(a, b);
    }

}


步骤4

使用 Context 来查看当它改变策略 Strategy 时的行为变化。


package com.pattern.strategy_pattern;

/**
 * Created by chen on 2018/3/29.
 * <p>
 * Email 122741482@qq.com
 * <p>
 * Describe:
 */
public class StrategyDemo {
    public static void main(String[] args) {
        Context context1 = new Context(new SubstractStrategy());
        context1.executeStrategy(1,2);


        Context context2 = new Context(new AdditionStrategy());
        context2.executeStrategy(1,2);
    }
}

步骤5

查看输出


减法运行 a-b=-1
加法运算 a+b=3

博客源码地址https://gitee.com/jamen/design-pattern

我的官网http://guan2ye.com
我的CSDN地址http://blog.csdn.net/chenjianandiyi
我的简书地址http://www.jianshu.com/u/9b5d1921ce34
我的githubhttps://github.com/javanan
我的码云地址https://gitee.com/jamen/
阿里云优惠券https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=vf2b5zld&utm_source=vf2b5zld

阿里云教程系列网站http://aliyun.guan2ye.com

1.png

我的开源项目spring boot 搭建的一个企业级快速开发脚手架

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 很难定义男人是不是一种喜新厌旧的动物,也许这是出于本能。同样也不能刻板印象地说,男人是一种坚强,勇敢,不轻易哭泣的...
    Andy_朱小饭阅读 381评论 0 2
  • 古风.钟大胆 任尔风云我自逍 家徒四壁见者潸,万里征途人未还。 弃官...
    任尔风云我自逍阅读 292评论 8 10
  • 一:自己在这过去的100天做了哪些工作?包括但不局限于英语方面,有哪些方面需要改变?哪些方面做得比较满意? 201...
    馨思遇阅读 364评论 0 1