策略模式

什么是策略模式?

策略模式定义了一系列算法,并将算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

策略模式解决的问题

去往某个目的地,我们有多种出行方式,可以选择地铁,公交,步行或者是开车,最终不同的出行方式有不同的价格。如果我们通常的实现方式,提供一个出行的方法,并传入一个Mode,通过Mode判断最终选择的方式,计算价格,实际的方法中是一个个if...else的判断,这样理论上能够实现最终的结果。

如果以后添加了一种新的出行方式,那么我们要做两步:

(1)添加Mode

(2)添加一个新的if...else

这样势必导致了很复杂的代码量,我们可以换一种思路

(1)定义一个接口Strategy,该接口定义一个计算价格的方法。

(2)对于不同的出行方式分别实现该接口,在出行的方法中实现自己的规则。

(3)在具体选择出行时,根据方式选择不同的出行方式,传入不同的实现对象,计算价格。

策略模式的简单实现

根据如上方式,编写一个Demo.

首先我们定义一个接口CalculateStrategy,该接口定义了一个计算价格的方法。

public interface CalculateStrategy{

// 计算价格public int calculatePrice();

}

其次,我们有两种出行方式,公交车和地铁,对于这两种方式,有不同的计算价格,所以我们编写两个实现类实现接口。

公交车的价格计算方式:

public class BusStrategy implements  CalculateStrategy{

@Override

public int calculatePrice() {

// 公交车的出行的价格

return10;

}

}

地铁的计算方式

public class SubwayStrategy implements CalculateStrategy{

@Override

public intcalculatePrice() {// 地铁的出行return5;

}

}

如上,准备完成,我们该出发了,定义出行的类TranficCalculator

public classTranficCalculator {

// 多态,父类引用

CalculateStrategymStrategy;

// 设置出行方式

public voidsetmStrategy(CalculateStrategy mStrategy) {

this.mStrategy= mStrategy;

}

// 计算价格

public intcalculatePrice(){

returnmStrategy.calculatePrice();

}

public static voidmain(String[] args){

TranficCalculator calculate =newTranficCalculator();

calculate.setmStrategy(newBusStrategy());// 设置出行方式

intprice = calculate.calculatePrice();//计算价格

}

}

在main函数中,我们首先构造出行的对象calculate,设置其出行方式,调用计算价格的方法就得出了最终的价格。

如果是地铁,我们只需要new SubwayStrategy()对象传入即可,如果以后增加了出行方式,只需要继承Strategy即可。省略了复杂的if else流程。

实际使用举例

动画插值器

如果使用过动画的同学应该都设置过插值器,当我们想要对动画的过程变化进行控制时,可以通过anim.setInterpolator(new AccelerateInterpolator());设置插值器,Android提供了匀速,加速减速,减速等插值器。

看原理就能明白,当我们需要改变动画变化过程时,只需要传入插值器的实现类的实例化方法,交由他来计算这个变化。具体的动画不需要了解不同插值器的计算方式。

网络请求的封装

在实际的开发中,往往使用一些第三发的网络请求库,例如volley,okhttp,retrofit等等,如果我们使用了其一,当因为需要去换另一个框架的时候,会非常的麻烦,此时我们可以使用策略模式来解决我们的问题。

对于网络请求的使用,无非就是几个常用的方式:

(1)设置header

(2)设置请求参数

(3)设置请求方式

(4)结果回调

我们可以将上述的操作抽象出一个接口,利用使用的网络框架编写一个XXXAdapter来实现接口中的方法,那么在使用过程中通过保持接口的引用进行网络请求即可,如果下一次需要更换网络框架,只需要重新编写一个XXXAdaopter传入即可。

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

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,096评论 9 62
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,091评论 2 16
  • 源码地址 介绍 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使...
    yangMr阅读 346评论 0 1
  • 版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处作者: TigerChain地址: htt...
    TigerChain阅读 1,518评论 4 12
  • 在上一篇文章中,介绍了插值器的重用。从源码中我们得知到我们可以为动画设置不同的插值器。最后使用到插值器的功能只是他...
    锐_nmpoi阅读 226评论 0 0