什么是策略模式

策略模式应该是Java设计模式中最简单的一种模式, 它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑。

其实具体的说,它也是基于面向接口编程的思想,通过定义不同的实现类逻辑来做到的。

策略模式接口定义

比方说现在需要一个计算逻辑,对两个输入的数进行某种运算, 这里可以定义接口为

public interface Caculator {
    public int doCaculate(int a, int b);
}

策略模式实现

现在如果需要实现加法和算法,只需要定义两个对应的类,实现接口就可以

public AddCaculator implements Caculator {
    public  int doCaculate(int a, int b) {
        return a + b;
    }
}

public SubstractCaculator implements Caculator {
    public  int doCaculate(int a, int b) {
        return a - b;
    }
}

最后一步,策略模式需要一个策略类,

public class CalContext {
    private Caculator strategy;

    public CalContext ( Caculator caculator) {
        this.strategy = caculator;
    }

    public int executeStragety(int a , int b) {
        return this.stragety.doCaculate(a, b);
    }
}
```

#### 策略模式使用
在需要使用这个计算逻辑的时候,只需要实例化对应的类就可以,

javascript …. Caculator caculator = new AddCaculator(); CalContext context = new CalContext(caculator); context.executeStragety(1, 2); ````

划重点

到这里你可能会有些疑问,策略模式跟简单工厂模式有什么区别? 都是定义个接口,往一个Context/Factory类里传东西,然后执行抽象好的接口, 从代码层次来说一模一样啊? 这里来回顾下之前说的工厂模式, 设计模式之工厂模式

这里重点关注一个地方, 我们往 Context/Factory 的构造方法里穿的东西不同 · 策略模式 我们传的是构造好的执行对象, AddCaculator() · 工厂模式 这里传的是不是对象,而是定义好的参数,比如 "add"

他俩的区别在于,策略模式需要调用者创建好执行逻辑的对象,而工厂模式只需要告诉工厂我们要创建什么。

这么说可能不够具体,你可以这么想象, 我们去了一个咖啡厅,想喝一杯咖啡, 策略模式的咖啡厅会说

想喝卡布奇诺还是拿铁,自己调好咖啡和奶的比例拿给他,他帮你在咖啡机上磨好装杯子里给你

工厂模式的咖啡厅会说

跟他说要卡布奇诺还是拿铁就行,你不需要关心咖啡豆的比例和制作过程,他帮你做好装杯子里给你

总结

策略模式跟工厂模式其实思想非常接近, 都是通过接口来去耦合, 而两者的区别也比较容易理解, 策略模式侧重于让调用者控制逻辑的实现, 工厂模式则侧重于让调用者不关心具体的逻辑,只关心需要用什么东西。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

[每日一题]简单编码

题目描述 最近Kingly对编码很感兴趣,于是从网上找了一些编码原则来对字符串做实验。由于Kingly一直很忙,所以希望你这位编程高手来替他解决这个问题。下面是...

30660
来自专栏CDA数据分析师

飞跃式发展的后现代 Python 世界

如果现代Python有一个标志性特性,那么简单说来便是Python对自身定义的越来越模糊。在过去的几年的许多项目都极大拓展了Python,并重建了“Python...

22760
来自专栏编程之旅

《Clean Code》 读书小节(二)

之前在看了《Clean Code》这本书的前两章时,就写下了第一篇读书小节,而随着读书的深入,便决定再总结一下后面一部分的读书心得。

8930
来自专栏chenssy

如何 “干掉” if...else

if...else 是所有高级编程语言都有的必备功能。但现实中的代码往往存在着过多的 if...else。虽然 if...else 是必须的,但滥用 if......

13520
来自专栏数说工作室

撕数据! |【SAS Says·扩展篇】

【SAS Says·扩展篇】撕数据! | 4. call PRXPOSN() 0. 前集回顾 1. 新的问题 2. 初识 PRXPOSN() 3. 问题解决 -...

35870
来自专栏nimomeng的自我进阶

探索命名之美(二)

大家在编码或者读代码的过程中,对于什么样的命名是好的命名可能认知不是特别清晰,但是对于什么样的命名是坏的命名应该一目了然,他们包括:

8920
来自专栏take time, save time

你所能用到的数据结构(六)

八、数据结构不一定很枯燥   正如我现在实习的公司的一个同事说的那样,数据结构是一本催眠的书,我想对于大多数人应该是这样的,当然对我也是,看着一大堆的算法,结...

34750
来自专栏申龙斌的程序人生

零基础学编程033:字符串的split拆分与join连接

在《零基础学编程021:获取股票实时行情数据》这一节里,我们学了split()函数,可以将一个字符串切开。假设有一个历史行情字符串,信息包括:股票名称、开盘价、...

304110
来自专栏Linyb极客之路

简洁又快速地处理集合——Java8 Stream(上)

本篇文章主要是让大家能够理解 Stream,理解它的基本原理,理解我们为什么需要使用 Stream 以及它的好处,而具体的实战环节我会在下篇文章中讲解。

69450
来自专栏GopherCoder

『No25: 编写可读代码的艺术(2)』

根据:先处理正向逻辑,处理简单的,处理可疑或者有趣的准则,改善如下(仅仅只是调换顺序)

12020

扫码关注云+社区

领取腾讯云代金券